%% ceurart.cls
%% Copyright 2019--2022 CEUR Workshop Proceedings (CEUR-WS.org)
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Dmitry S. Kulyabov.
% The code was originally based on 'CAS Bundle' code.
% 

\def\RCSfile{ceurart}%
\def\RCSversion{0.4.12}%
\def\RCSdate{2023/07/18}%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{\RCSfile}[\RCSdate, \RCSversion: Typesetting articles for CEUR Workshop Proceedings (CEUR-WS.org)]

\RequirePackage{expl3,xparse}
\@ifundefined{regex_match:nnTF}{\RequirePackage{l3regex}}{}

\ExplSyntaxOn

%%
%% switches
%%

\newif\iflongmktitle    \longmktitlefalse

%% twocolumn
\newif\ifdc             \global\dcfalse
\newif\ifsc             \global\sctrue
\newif\ifcasreviewlayout  \global\casreviewlayoutfalse
\newif\ifcasfinallayout   \global\casfinallayoutfalse
%% enable header and footer
\bool_new:N \g_ceur_hf_bool
\bool_gset_false:N \g_ceur_hf_bool

% \ifhf
%   \bool_gset_true:N \g_ceur_hf_bool
% \fi
%% header and footer
% \newif\ifhf
% \global\hffalse

\newcounter{blind}
\setcounter{blind}{0}

% \def\blstr#1{\gdef\@blstr{#1}}
% \def\@blstr{1}
% \newdimen\@bls
% \@bls=\baselineskip

%\newif\if@twocolumn
\DeclareOption{twocolumn}{\global\dctrue \global\scfalse}
\DeclareOption{hf}{\bool_gset_true:N \g_ceur_hf_bool}
% \DeclareOption{hf}{\global\hftrue}

\DeclareOption{singleblind}{\setcounter{blind}{1}}
\DeclareOption{doubleblind}{\setcounter{blind}{2}}
\DeclareOption{longmktitle}{\global\longmktitletrue}
\DeclareOption{final}{\global\casfinallayouttrue}
\DeclareOption{review}{\global\casreviewlayouttrue}

% \ExecuteOptions{a4paper,10pt,oneside,review}
% \ExecuteOptions{a4paper,oneside,10pt,DIV=calc}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\PassOptionsToClass{a4paper,twoside=false}{scrartcl}
\ProcessOptions\relax
\LoadClass{scrartcl}
\KOMAoptions{DIV=10}
\ifdc
  \KOMAoptions{fontsize=9pt}
\else
  \KOMAoptions{fontsize=11pt}
\fi

\RequirePackage{graphicx}
\RequirePackage{amsmath,amsfonts,amssymb}
\allowdisplaybreaks

\RequirePackage{etoolbox,balance}
\RequirePackage{booktabs,makecell,multirow,array,colortbl,dcolumn,stfloats}
\RequirePackage{xspace,xstring}
\RequirePackage[hang,flushmargin]{footmisc}
\RequirePackage[svgnames,dvipsnames]{xcolor}
\RequirePackage{iftex}
\RequirePackage{microtype}

%% PDF/A support

\ifpdftex
\RequirePackage{cmap}
\fi

\bool_new:N \g_ceur_pdfx_bool
\bool_gset_false:N \g_ceur_pdfx_bool

\file_if_exist:nTF { pdfx.sty } {%

  % {{{ Temporary fix for error using pdfx on Tex Live 2021
  
  % pdfx v1.6.3 from 2019-02-27 is bad, so anything later is hopefully fixed...

  % \IfFormatAtLeastTF do not exist in LaTeX versions older than 2020-10-01. 
  \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
  % Problem with issue https://github.com/latex3/latex2e/issues/605
  % We do not need fix with older version of LaTeX
  \IfFormatAtLeastTF{2021/06/01}{%

    % temporarily reverts https://github.com/latex3/latex2e/commit/5fb2860f2fedc87b213730f06ec1d77bcab4814a
    % resp. https://github.com/latex3/latex2e/commit/dd2ec509ec98e9c359a41e35aea6aade86485ca2
    % as it breaks pdfx (see https://tex.stackexchange.com/questions/605854/error-using-pdfx-on-tex-live-2021)
    
    % this is the old implementation from base/ltpara.dtx, version 1.0g
    \cs_new_protected:Npn \__old_para_end: {
      % ltpara v1.0h as well as firstaid/latex2e-first-aid-for-external-files.dtx v1.0o inserted
      % \scan_stop: here, which breaks pdfx
      \mode_if_horizontal:TF {
        \mode_if_inner:F {
          \tex_unskip:D
          \hook_use:n{para/end}
          \@kernel@after@para@end
          \mode_if_horizontal:TF {
            \if_int_compare:w 0 < \tex_lastnodetype:D
            \tex_kern:D \c_zero_dim
          \fi:
          \tex_par:D
          \hook_use:n{para/after}
          \@kernel@after@para@after }
          { \msg_error:nnnn { hooks }{ para-mode }{end}{horizontal} }
        }
      }
      \tex_par:D
    }
    
    % \PackageWarning{ceurart}{Patching~\para_end:~implementation~to~fix~pdfx}
    
    \cs_set_eq:NN \par     \__old_para_end:
    % these two aren't actually required to fix pdfx, so we'll skip them...
    % \cs_set_eq:NN \@@par   \__old_para_end:
    % \cs_set_eq:NN \endgraf \__old_para_end:
    
    \AtBeginDocument{
      
      % \PackageWarning{ceurart}{Restoring~old~\para_end:~implementation}
      
      % restore additional definitions
      \cs_set_eq:NN \par     \para_end:
      % see above: as we didn't replace them, no need to restore them.
      % \cs_set_eq:NN \@@par   \para_end:
      % \cs_set_eq:NN \endgraf \para_end:
    }
  }{}

  % }}}
  
  \RequirePackage[useBOM,pdf17,a-1a]{pdfx}
  \bool_gset_true:N \g_ceur_pdfx_bool
}{%
  \RequirePackage[unicode]{hyperref}
}
\hypersetup{%
  colorlinks,
  bookmarksnumbered,
  pdfencoding=unicode,
  allcolors=DarkSlateGrey
}
\pdfstringdefDisableCommands{%
  \def\addtocounter#1#2{}%
  \def\unskip{}%
  \def\textbullet{- }%
  \def\textrightarrow{ -> }%
  \def\footnotemark{}%
}
\urlstyle{rm}
\colorlet{scolor}{black}
\colorlet{hscolor}{DarkSlateGrey}
% \AtEndDocument{\hypersetup
%   {pdftitle={\csuse{__short_title:}},
%   pdfauthor={\csuse{__short_authors:}}}}

\let\comma\@empty
\let\tnotesep\@empty
\let\@title\@empty

\let\pdfxauthors\@empty
\let\pdfxkeywords\@empty

%
% Load Common items
%

%%
%%
%%

%%
%% Bools
%%

%%
%% Bells and Whistles
%%

\bool_new:N \g_ceur_nologo_bool
\bool_gset_false:N \g_ceur_nologo_bool

\file_if_exist:nTF { fontawesome5.sty } {%
  \RequirePackage{fontawesome5}
  % We need orcid icon
  \@ifpackagelater{fontawesome5}{2020/01/17}{%
    \bool_gset_false:N \g_ceur_nologo_bool
  }{%
    \bool_gset_true:N \g_ceur_nologo_bool
  }
}{%
  \bool_gset_true:N \g_ceur_nologo_bool
}

%%
%% PDF/A
%%

%% allocate a write stream
\iow_new:N \g_xmpdata_output_iow
\iow_open:Nn \g_xmpdata_output_iow { \c_sys_jobname_str .xmpdata }

%% User interface
\NewDocumentCommand{\xmpdatawrite}{ m m } {
  \xmpdata_write:n { \iow_char:N \\ #1 \iow_char:N \{ #2 \iow_char:N \} }
}

%% Inner function
\cs_new_protected:Npn \xmpdata_write:n #1
{
  \iow_now:Nx \g_xmpdata_output_iow { #1 }
}

%%
%% Utils
%%

%% Workaround for unwanted '.pdf' to path (provided by hyperref)
%% https://tex.stackexchange.com/questions/154335/href-adds-unwanted-pdf-to-path-provided
\providecommand*{\hrefurl}{\hyper@normalise\hrefurl@}
\providecommand*{\hrefurl@}[2]{\hyper@linkurl{#2}{#1}}

%%
%%
%%

% \newcommand\ceurConference[4][]{%
%   \gdef\ceurConference@shortname{#1}%
%   \gdef\ceurConference@name{#2}%
%   \gdef\ceurConference@date{#3}%
%   \gdef\ceurConference@venue{#4}%
%   \ifx\ceurConference@shortname\@empty
%     \gdef\ceurConference@shortname{#2}%
%   \fi
% }

\DeclareRobustCommand\conference[1]{%
  \gdef\ceurConference@name{#1}%
}

\NewDocumentCommand \noindentfoot {} {
  \raggedright
  \hspace*{-\parindent}
  \hspace*{-\footnotemargin}
}

%
% Specific to Single Column
%

\RenewDocumentCommand \maketitle {} {
  \nonumnote{\itshape \ceurConference@name}
  \logonote{\@copyrightLine}
  \logonote{\@ceurLogoLine}
  % \ifbool { usecasgrabsbox }
  %   {
  %     \setcounter{page}{0}
  %     \thispagestyle{empty}
  %     \unvbox\casgrabsbox
  %   } { }
  % \pagebreak
  % \ifbool { usecashlsbox }
  %   {
  %     \setcounter{page}{0}
  %     \thispagestyle{empty}
  %     \unvbox\casauhlbox
  %   } { }
  %     \pagebreak
  \thispagestyle{plain}
  \xdef\firstpage{\thepage}
  % \thispagestyle{first}
  % \pagestyle{standard}
  \ifbool{longmktitle}
  {
    \LongMaketitleBox
    \ProcessLongTitleBox
  }
  {
    \ifbool{dc}
    { \twocolumn[\MaketitleBox] }
    { \MaketitleBox }
    \printFirstPageNotes
  }
  \normalcolor \normalfont
  \setcounter{footnote}{\int_use:N \g_ceur_fnote_int}  
  \renewcommand\thefootnote{\arabic{footnote}}
  \gdef\@pdfauthor{\infoauthors}
  % \gdef\@pdfsubject{Complex ~CEUR ~Content}

  %% PDF/A
  
  % List of supported metadata fields
  
  % General information:
  
  % \Author           - the document's human author. Separate multiple authors with \sep.
  % \Title            - the document's title.
  % \Keywords         - list of keywords, separated with \sep.
  % \Subject          - the abstract.
  % \Org              - publishers.

  % Copyright information:

  % \Copyright        - a copyright statement.
  % \CopyrightURL     - location of a web page describing the owner and/or rights statement for this document.
  % \Copyrighted      - 'True' if the document is copyrighted, and
  % 'False' if it isn't. This is automatically set to 'True' if either
  % \Copyright or \CopyrightURL is specified, but can be overridden.
  
  % Publication information:

  % \PublicationType   - The type of publication. If defined, must be
  % one of book, catalog, feed, journal, magazine,
  % manual, newsletter, pamphlet. This is
  % automatically set to "journal" if \Journaltitle
  % is specified, but can be overridden.
  % \Journaltitle      - The title of the journal in which the document
  % was published.
  % \Journalnumber     - The ISSN for the publication in which the
  % document was published.
  % \Volume            - Journal volume.
  % \Issue             - Journal issue/number.
  % \Firstpage         - First page number of the published version of
  % the document.
  % \Lastpage          - Last page number of the published version of
  % the document.
  % \Doi               - Digital Object Identifier (DOI) for the
  % document, without the leading "doi:".
  % \CoverDisplayDate  - Date on the cover of the journal issue, as a
  % human-readable text string.
  % \CoverDate         - Date on the cover of the journal issue, in a
  % format suitable for storing in a database field
  % with a 'date' data type.
  
  \bool_if:NTF \g_ceur_pdfx_bool
  {
    \xmpdatawrite{Title}{\detokenize\expandafter{\casprelimstitle}}
    \xmpdatawrite{Author}{\pdfxauthors}
    \xmpdatawrite{Keywords}{\pdfxkeywords}
    \xmpdatawrite{Subject}{CEUR~Workshop~Proceedings~(CEUR-WS.org)}

    \ifx\@copyrightclause\@empty\else
      \xmpdatawrite{Copyright}{\iow_char:N \\ copyright\ \@copyrightyear\ \@copyrightclause}
      \xmpdatawrite{CopyrightURL}{https://creativecommons.org/licenses/by/4.0}
    \fi

    \xmpdatawrite{Journaltitle}{CEUR~Workshop~Proceedings}
    \xmpdatawrite{Journalnumber}{1613-0073}
    \bool_if:NTF \g_ceur_hf_bool {
        \xmpdatawrite{Firstpage}{\firstpage}
        \xmpdatawrite{Lastpage}{\lastpage}
    }{ }
  }{
    \hypersetup{%
      pdfcreator={ceurart.cls},
      % pdfproducer={pdfTeX;},
      % pdftitle={\csuse{__short_title:}},
      % pdfauthor={\csuse{__short_authors:}},
      % pdfauthor={\csuse{__authors:}},
      % pdftitle={\@title},
      pdfsubject={CEUR~Workshop~Proceedings~(CEUR-WS.org)},
      pdfkeywords={\pdfxkeywords},
      linkcolor={hscolor},
      urlcolor={hscolor},
      citecolor={hscolor},
      filecolor={hscolor},
      menucolor={hscolor},
    }    
  }
}


  % pdfcreator={ceurart.cls},
  % % pdfproducer={pdfTeX;},
  % % pdftitle={\csuse{__short_title:}},
  % % pdfauthor={\csuse{__short_authors:}},
  % % pdfauthor={\csuse{__authors:}},
  % % pdftitle={\@title},
  % pdfsubject={CEUR Workshop Proceedings (CEUR-WS.org)},


%
% Front matter macros
%
% The front matter macros are derived/adopted from stm-prelims.sty
% written by CV Radhakrishnan <cvr@cvr.cc> and copyrighted by him.
% Usage of those macros and methods are gratefully acknowledged.
%

\keys_define:nn { ceur / title } {
  mode      .choice:     ,
  mode / title  .meta:n  = {
    type   = title      ,
    size   = \LARGE      ,
    % size   = \huge      ,
    % shape  = \upshape   ,
    shape  = \sffamily   ,
    % weight = \mdseries  ,
    weight = \bfseries  ,
    color  = black  ,
    before = 0pt        ,
    after  = 0pt        ,
    align  = \raggedright ,
  } ,
  mode / alt  .meta:n  = {
    type   = alt      ,
    size   = \large     ,
    shape  = \upshape   ,
    weight = \mdseries  ,
    color  = black  ,
    before = 6pt        ,
    after  = 0pt        ,
    align  = \raggedright ,
  } ,
  mode / sub    .meta:n  = {
    type   = sub           ,
    size   = \large        ,
    shape  = \upshape      ,
    weight = \mdseries     ,
    color  = black!80  ,
    before = 6pt          ,
    after  = 0pt           ,
    align  = \raggedright  ,
  } ,
  mode / trans   .meta:n  =  {
    type   = trans         ,
    size   = \normalsize   ,
    shape  = \upshape      ,
    weight = \mdseries     ,
    color  = black!60      ,
    before = 6pt           ,
    after  = 0pt           ,
    align  = \raggedright  ,
  } ,
  mode / transsub   .meta:n  = {
    type   = transsub      ,
    size   = \small        ,
    shape  = \upshape      ,
    weight = \mdseries     ,
    color  = black!50      ,
    before = 6pt           ,
    after  = 0pt           ,
    align  = \raggedright  ,
  } ,
  mode / ascii   .meta:n  = {
    type   = ascii            ,
    size   = \small\ttfamily  ,
    shape  = \upshape         ,
    weight = \mdseries        ,
    color  = black            ,
    before = 12pt             ,
    after  = 0pt              ,
    align  = \raggedright     ,
  } ,
  type      .tl_set:N    = \l_ceur_title_type_tl      ,
  size      .tl_set:N    = \l_ceur_title_size_tl      ,
  shape     .tl_set:N    = \l_ceur_title_shape_tl     ,
  weight    .tl_set:N    = \l_ceur_title_weight_tl    ,
  before    .dim_set:N   = \l_ceur_title_before_dim   ,
  after     .dim_set:N   = \l_ceur_title_after_dim    ,
  align     .tl_set:N    = \l_ceur_title_align_tl     ,
  color     .tl_set:N    = \l_ceur_title_color_tl     ,
}

\NewDocumentCommand \processTmarks { } {
  \cs_if_free:cTF { mark@title }
  { \ignorespaces }
  { \tl_set:Nx \l_tmpa_tl { \cs:w mark@title\cs_end: }
    \clist_map_inline:cn { mark@title }
    {
      \str_case:nn { ##1 }
      {
        { 1 }  { $^\star$ }
        { 2 }  { $^{,\star\star}$ }
        { 3 }  { $^{,\star\star\star}$ }
      }
    }
  }
}

\RenewDocumentCommand \title { O{mode = title} m } {
  \pdfstringdef \@pdftitle { #2 }
  \csgdef { casprelimstitle } { #2 }
  \keys_set:nn { ceur / title } { #1 }
  \tl_if_empty:NTF \__short_title: {
    \cs_gset:Nn \__short_title: { #2 }
  }{ }
  \seq_gput_right:Nn \g_ceur_title_seq {
    \keys_set:nn { ceur / title } { #1 }
    % \iow_term:n { MODE:~\l_ceur_title_mode_tl ~ ~ [#1]}
    \par \vskip \l_ceur_title_before_dim
    \l_ceur_title_align_tl
    \l_ceur_title_size_tl
    \l_ceur_title_shape_tl
    \l_ceur_title_weight_tl
    \color { \l_ceur_title_color_tl }
    #2
    \tl_set:Nn \l_tmpa_tl { title }
    \tl_if_eq:NNTF \l_ceur_title_type_tl \l_tmpa_tl
    { \processTmarks } { }
    \par \vskip  \l_ceur_title_after_dim
    \normalcolor \normalsize \normalfont
  }
}

%  \gappto\usestmtitle{#1}%

\renewcommand \@title { \seq_use:Nn \g_ceur_title_seq { } }

\renewcommand{\subtitle}[1]{\title[mode=sub]{#1}}

\NewDocumentCommand \wrAun { m }      %  unexpanded write to aux
   { \iow_now:Nn \@auxout { #1 } }
\NewDocumentCommand \wrAux { m }      %  expanded write to aux
   { \iow_now:Nx \@auxout { #1 } }

\NewDocumentCommand \wrShipAux { m }   % expanded write at shipout
   { \iow_shipout:Nx \@auxout { #1 } }
\NewDocumentCommand \wrShipAun { m }   % unexpanded write at shipout
   { \iow_shipout:Nn \@auxout { #1 } }

\NewDocumentCommand \ceurLabel { m } {
  \@bsphack \wrAux
  { \token_to_str:N \NewLabel { #1 }
    { \@currentlabel }
  } \@esphack
}

\NewDocumentCommand \NewLabel { m m } {
  \cs_if_free:cTF { X@#1: }
  { \cs_new:cx { X@#1: } { #2 } }
  { \cs_set:cx { X@#1: } { #2 } }
}

\NewDocumentCommand \ceurRef { m } {
  \cs_if_free:cTF { X@#1: }
  { 0 } {\use:c {X@#1:} }
}

\seq_clear_new:N \l_fnmk_seq
\NewDocumentCommand \processFnRef { m } {
  \seq_clear:N \l_fnmk_seq
  \clist_map_inline:nn { #1 }
  { \seq_put_right:Nx \l_fnmk_seq
    {\cs_if_free:cTF { X@##1: } {0} { \use:c {X@##1:} }}
  }
}

\NewDocumentCommand \fnmark { O{} } {
  \writemarks { fnau\theau@ } { #1 }
}


\NewDocumentCommand  \fnref { m } {
  \processFnRef { #1 }
  \wrAux { \token_to_str:N \csxdef {mark@fnau\theau@}
    { \seq_use:Nn \l_fnmk_seq  { , } } }
}

\NewDocumentCommand \corref { m } {
  \str_set:Nx \l_tmpa_str { \ceurRef { #1 } }
  \wrAux { \token_to_str:N \csxdef { mark@corau\theau@ }
    {
      \cs_if_free:cTF { X@#1: } {0} { \use:c {X@#1:} }
    }
  }
}

\NewDocumentCommand \cormark { O{} } {
  \@cormarktrue
  \writemarks {corau\theau@} { #1 }
}

\seq_new:N \l_ceur_au_seq
\seq_new:N \l_ceur_au_sn_seq
\seq_new:N \l_ceur_au_fn_seq
\seq_new:N \l_ceur_au_ead_seq
\seq_new:N \l_ceur_au_orcid_seq
\seq_new:N \l_ceur_au_email_seq
\seq_new:N \l_ceur_au_url_seq
\seq_new:N \l_ceur_au_contrib_role_seq

\NewDocumentCommand \parsename { m } {
  \seq_set_split:Nnn \l_ceur_au_seq { ~ } { #1 }
  \seq_pop_right:NN \l_ceur_au_seq \l_ceur_au_sn_seq
  \seq_map_inline:Nn \l_ceur_au_seq
  { \seq_put_right:Nx \l_ceur_au_ead_seq
    { \tl_head:n { #1 }. }
  }
}

\NewDocumentCommand \invparsename { m } {
  \seq_set_split:Nnn \l_ceur_au_seq { ~ } { #1 }
  \seq_pop_left:NN \l_ceur_au_seq \l_ceur_au_sn_seq
  \seq_map_inline:Nn \l_ceur_au_seq
  { \seq_put_right:Nx \l_ceur_au_ead_seq
    { \tl_head:n { #1 }. }
  }
}

\NewDocumentCommand \surname {} {
  \l_ceur_au_sn_seq
}

\NewDocumentCommand \firstname {} {
  \seq_use:Nn \l_ceur_au_seq { \no_break_space: }
}

\NewDocumentCommand \eadauthor {} {
  \seq_map_inline:Nn \l_ceur_au_seq
  {
    \regex_match:nnTF { \. } { ##1 }
    { ##1 \, }
    { \tl_head:n {##1}. \, }
  } {\,} \l_ceur_au_sn_seq
}

\cs_set_eq:NN \shortauthor \eadauthor

\seq_clear_new:N \l_affmk_seq
\NewDocumentCommand \processAffRef { m }
   {
     \seq_clear:N \l_affmk_seq
     \clist_map_inline:nn { #1 }
     {
       \seq_put_right:Nx \l_affmk_seq
       {\ceurRef{##1}}
      }
    }

\NewDocumentCommand \processAffNum { m }
   {
     \seq_clear:N \l_affmk_seq
     \clist_map_inline:nn { #1 }
     {
       \seq_put_right:Nn \l_affmk_seq
       { \int_to_arabic:n {##1} }
      }
    }

\NewDocumentCommand \listAff { }
   {
     \tl_if_blank:nTF { \l_affmk_seq }
       { \tl_gset:Nn \g_ceur_comma_tl { 0 } }
       {
         \seq_use:Nn \l_affmk_seq { , }
         \tex_def:D \sep{\unskip,}
       }
   }

\NewDocumentCommand \ead { O{} m }
   {
     \tl_if_empty:nTF { #1 } { \@ead {#2} } { \@uad[#1]{#2} }
   }

\NewDocumentCommand \eadsep { } { }

\int_new:N \g_ead_int
\seq_new:N \g_ceur_ead_seq
\int_new:N \g_uad_int
\int_new:N \g_orcid_int
\seq_new:N \g_ceur_uad_seq
\seq_new:N \g_ceur_orcid_seq
\seq_new:N \g_ceur_contrib_role_seq

\newcommand\theead { \int_use:N \g_ead_int }

\NewDocumentCommand \@uad { O{} m }
   {
     \group_begin:
     \wrAux { \token_to_str:N \urlauthor
       { \exp_not:n {#2}}{\the\@eadauthor}}%
     \group_end:
   }

\NewDocumentCommand \urlauthor { m m } {
  \int_gincr:N \g_uad_int
  \seq_gput_right:Nn \g_ceur_uad_seq
  {
    { %\ttfamily \tl_to_str:n
      \url{ #1 } }
    \parsename { #2 }
    \space(\eadauthor)
  }
}
\NewDocumentCommand \@stmuads { }
  { \seq_use:Nn \g_ceur_uad_seq { ;~ } }

\NewDocumentCommand \@ead { m }
   {
     \group_begin:
     \wrAux { \token_to_str:N \emailauthor
       { \exp_not:n { #1 }}{ \the\@eadauthor }}
     \group_end:
   }

\newtoks \@eadauthor
\newbool{@cormark}

\NewDocumentCommand \emailauthor { m m }
{
  \int_gincr:N \g_ead_int
  \seq_gput_right:Nn \g_ceur_ead_seq
  {
    % { \ttfamily \tl_to_str:n { #1 } }
    { \href {mailto: #1 } { \protect\nolinkurl{#1} } }
    \parsename { #2 }
    \space(\eadauthor)%
  }
}

\NewDocumentCommand \@elseads { }
{
  \seq_use:Nn \g_ceur_ead_seq { ;~ }
}

\NewDocumentCommand \printemails { } {
  \group_begin:
  \int_compare:nNnTF { \int_use:N \g_ead_int } > { 0 } {
    \tex_let:D \thefootnote \relax \footnotetext {
      \raggedright
      \hspace*{-\parindent}
      % \hspace*{-\labelsep}
      \hspace*{-\footnotemargin}
      \bool_if:NTF \g_ceur_nologo_bool {
        \int_compare:nTF { \g_ead_int = 1 }
        { \textsc{email:\c_space_token} }
        { \textsc{email:\c_space_token} }
      }
      { \faIcon[regular]{envelope-open}\c_space_token }
      \seq_use:Nn \g_ceur_ead_seq { ;~ }
    }
  } {  }
  \group_end:
}

\NewDocumentCommand \printurls { } {
  \group_begin:
  \int_compare:nTF { \g_uad_int > 0 } {
    \tex_let:D \thefootnote \relax \footnotetext {
      \raggedright
      \hspace*{-\parindent}
      % \hspace*{-\labelsep}
      \hspace*{-\footnotemargin}
      \bool_if:NTF \g_ceur_nologo_bool
      { \textsc{url:\c_space_token} }
      { \faIcon{globe}\c_space_token }
      \seq_use:Nn \g_ceur_uad_seq { ;~ }
    }
  } { }
  \group_end:
}

%%
%% orcid
%%

\NewDocumentCommand \orcidauthor { m m } {
  \int_gincr:N \g_orcid_int
  \seq_gput_right:Nn \g_ceur_orcid_seq {
    % { \ttfamily \tl_to_str:n { #1 } }
    { \hrefurl { https://orcid.org/ #1 } { #1 } }
    \parsename{#2}
    \space(\eadauthor)
  }
}

\NewDocumentCommand \printorcid { } {
  \group_begin:
  \int_compare:nTF { \g_orcid_int > 0 } {
    \tex_let:D \thefootnote \relax \footnotetext {
      \raggedright
      \hspace*{-\parindent}
      % \hspace*{-\labelsep}
      \hspace*{-\footnotemargin}
      \bool_if:NTF \g_ceur_nologo_bool
      { \textsc{orcid:\c_space_token} }
      { \faIcon{orcid}\c_space_token }
      \seq_use:Nn \g_ceur_orcid_seq { ;~ }
    }
  } { }
  \group_end:
}

%
% Contrib Role
%

\seq_gclear_new:N \g_ceur_credits_seq

\NewDocumentCommand \ContribRole { m }
{
  \wrAux { \token_to_str:N \creditauthor
    { #1 } { \the\@eadauthor } }
}

\NewDocumentCommand \creditauthor { m m }
{
  \seq_gput_right:Nx \g_ceur_credits_seq
  { { \exp_not:N\bfseries #2 :}\space #1 }
}

\cs_set_eq:NN \credit \ContribRole

\NewDocumentCommand \printcredits { }
{
  \seq_if_empty:NF \g_ceur_credits_seq
  {
    \section*{CRediT ~authorship ~contribution ~statement}
    \seq_use:Nn \g_ceur_credits_seq { .~ }.
  }
}

\NewDocumentCommand \writemarks { m m }
   { \wrAux { \token_to_str:N \csgdef{mark@#1}{#2} } }

\seq_new:N \g_ceur_title_seq

\NewDocumentCommand \tnotemark { O{} }
   { \writemarks { title } { #1 } }

\NewDocumentCommand \@tnoteref { m }
   { \int_set:Nn \l_tmpa_int { 0 }
     \clist_map_inline:nn { #1 }
      {
%        \msg_term:n { ##1 .. [\cs:w X@##1:\cs_end:] }
        \cs_if_free:cTF { X@##1: }
          { \csdef{X@##1:}{0} }
          {
            \tl_set:Nx \l_tmpa_tl { \cs:w X@##1:\cs_end: }
            \int_case:nn { \l_tmpa_tl }
              {
                 { 1 }  { $^\star$ }
                 { 2 }  { $^{,\star\star}$ }
                 { 3 }  { $^{,\star\star\star}$ }
              }
          }
      }
    }

\seq_new:N \g_ceur_tnote_seq
\int_new:N \g_ceur_tnote_int

\NewDocumentCommand \tnotetext { O{} m }
   {
     \tl_if_head_eq_catcode:nNTF { #1 } a
       {
         % \msg_term:n { [TNOTE:~alpha] }%
         \seq_gput_right:Nn \g_ceur_tnote_seq
           { \int_incr:N \g_ceur_tnote_int
             \str_set:Nx \@currentlabel { \int_use:N \g_ceur_tnote_int }
              \ceurLabel { #1 }
             \renewcommand\thefootnote
              { \int_case:nn { \g_ceur_tnote_int }
                 {
                   { 1 } { $^\star$ }
                   { 2 }  { $^{\star\star}$ }
                   { 3 }  { $^{\star\star\star}$ }
                 }
              }
              \footnotetext { #2 }
            }
          }
        {
          % \msg_term:n { [TNOTE:~Number] }
          \seq_gput_right:Nn \g_ceur_tnote_seq
          {
            \int_set:Nn \l_tmpa_int { #1 }
            \renewcommand\thefootnote
              { \int_case:nn { \l_tmpa_int }
                {
                  { 1 } { $^\star$ }
                  { 2 }  { $^{\star\star}$ }
                  { 3 }  { $^{\star\star\star}$ }
                }
              }
             \footnotetext { #2 }
           }
         }
       }

\newcommand \printtnotes { \seq_use:Nn \g_ceur_tnote_seq { \par } }

\seq_new:N \g_ceur_nonumnote_seq

\NewDocumentCommand \nonumnote { m }
{
  \group_begin:
  \seq_gput_right:Nn \g_ceur_nonumnote_seq
  {
    \tex_def:D \thefootnote { }
    \footnotetext{%
      % \raggedright
      % \hspace*{-\parindent}
      % % \hspace*{-\labelsep}
      % \hspace*{-\footnotemargin}
      #1}
  }
  \group_end:
}

\newcommand \printnonumnotes { \seq_use:Nn \g_ceur_nonumnote_seq { \par } }

\seq_new:N \g_ceur_fnote_seq
\int_new:N \g_ceur_fnote_int

\NewDocumentCommand \fntext { O{} m } {
  \tl_if_head_eq_catcode:nNTF { #1 } a {
    % \msg_term:n { [FN:~alpha] }%
    \seq_gput_right:Nn \g_ceur_fnote_seq {
      \int_incr:N \g_ceur_fnote_int
      \str_set:Nx \@currentlabel { \int_use:N \g_ceur_fnote_int }
      \ceurLabel { #1 }
      % \tex_def:D \thefootnote { \int_use:N \g_ceur_fnote_int }
      \tex_def:D \thefootnote {
        \int_case:nn { \g_ceur_tnote_int } {
          { 1 } { $^{\dagger}$ }
          { 2 } { $^{\ddagger}$ }
          { 3 } { $^{\S}$ }
          { 4 } { $^{\P}$ }
          { 5 } { $^{\|}$ }
        }
      }
      \footnotetext { #2 }
    }
  } {
    % \msg_term:n { [FN:~Number] }
    \seq_gput_right:Nn \g_ceur_fnote_seq {
      \int_set:Nn \l_tmpa_int { #1 }
      % \tex_def:D \thefootnote { \int_use:N \l_tmpa_int }
      \tex_def:D \thefootnote {
        \int_case:nn { \l_tmpa_int } {
          { 1 } { $^{\dagger}$ }
          { 2 } { $^{\ddagger}$ }
          { 3 } { $^{\S}$ }
          { 4 } { $^{\P}$ }
          { 5 } { $^{\|}$ }
        }
      }
      \footnotetext { #2 }
    }
  }
}

\newcommand \printfnotes { \seq_use:Nn \g_ceur_fnote_seq { \par } }

\seq_new:N \g_ceur_cor_seq
\int_new:N \g_ceur_cor_int

\NewDocumentCommand \cortext { O{} m } {
  \tl_if_head_eq_catcode:nNTF { #1 } a  {
    % \msg_term:n { [COR:~alpha] }%
    \seq_gput_right:Nn \g_ceur_cor_seq {
      \int_incr:N \g_ceur_cor_int
      \str_set:Nx \@currentlabel { \int_use:N \g_ceur_cor_int }
      \ceurLabel { #1 }
      \tex_def:D \thefootnote {
        \int_case:nn { \g_ceur_cor_int } {
          { 1 } { $\ast$ }
          { 2 } { $\ast\!\ast$ }
          { 3 } { $\ast\!\ast\!\ast$ }
        }
      }
      \footnotetext { \noindentfoot #2 }
    }
  } {
    % \msg_term:n { [COR:~Number] }
    \seq_gput_right:Nn \g_ceur_cor_seq {
      \int_set:Nn \l_tmpa_int { #1 }
      \tex_def:D \thefootnote {
        \int_case:nn { \l_tmpa_int } {
          { 1 } { $\ast$ }
          { 2 } { $\ast\!\ast$ }
          { 3 } { $\ast\!\ast\!\ast$ }
        }
      }
      \footnotetext { #2 }
    }
  }
}

\newcommand \printcornotes { \seq_use:Nn \g_ceur_cor_seq { \par } }

\NewDocumentCommand \process@marks { } {
  \cs_if_free:cTF { mark@corau\theauthor }
  { \ignorespaces }
  { \str_set:Nx \l_tmpa_str { \use:c{ mark@corau\theauthor } }
    \int_case:nn { \l_tmpa_str } {
      { 1 } { \sep$\ast$ }
      { 2 } { \sep$\ast\ast$ }
      { 3 } { \sep$\ast\!\ast\!\ast$ }
    }
    \tex_def:D \sep{\unskip,}
  }
  %% 
  \cs_if_free:cTF { mark@fnau\theauthor }
  { \ignorespaces }
  { \str_set:Nx \l_tmpa_str { \use:c{ mark@fnau\theauthor } }
    \int_case:nn { \l_tmpa_str } {
      { 1 } { \sep${\dagger}$ }
      { 2 } { \sep${\ddagger}$ }
      { 3 } { \sep${\S}$ }
      { 4 } { \sep${\P}$ }
      { 5 } { \sep${\|}$ }
    }
    \tex_def:D \sep{\unskip,}
  }
}

%%
%% Author macros
%%

\seq_new:c { g_ceur_au0_seq }
\seq_new:c { g_ceur_clau0_seq }
\int_new:N \g_ceur_au_int
\int_new:N \g_ceur_aau_int

\NewDocumentCommand \ResetMarks { } {
  \keys_set:nn { ceur / author } {
    auid       = {} ,
    bioid      = {} ,
    alt        = {} ,
    style      = { normal } ,
    prefix     = {} ,
    suffix     = {} ,
    degree     = {} ,
    role       = {} ,
    orcid      = {} ,
    collab     = { false }  ,
    type       = { author } ,
    anon       = { false }  ,
    deceased   = { false }  ,
    twitter    = {} ,
    facebook   = {} ,
    linkedin   = {} ,
    plus       = {} ,
    gplus      = {} ,
    email      = {} ,
    url        = {} ,
  }
  \tex_gdef:D \sep{}
  \tex_gdef:D \ceur@corref{}
  \tex_gdef:D \@fnmark {}
}

\int_new:N \l_autype_int
\keys_define:nn { ceur / author } {
  auid     .tl_set:N   = \l_ceur_au_id_tl             ,
  bioid    .tl_set:N   = \l_ceur_au_bioid_tl          ,
  alt      .tl_set:N   = \l_ceur_au_alt_tl            ,
  style    .tl_set:N   = \l_ceur_au_style_tl          ,
  prefix   .tl_set:N   = \l_ceur_au_prefix_tl         ,
  suffix   .tl_set:N   = \l_ceur_au_suffix_tl         ,
  degree   .tl_set:N   = \l_ceur_au_degree_tl         ,
  role     .tl_set:N   = \l_ceur_au_role_tl           ,
  orcid    .tl_set:N   = \l_ceur_au_orcid_tl          ,
  collab   .bool_set:N = \l_ceur_au_collab_bool       ,
  type     .multichoice:                              ,
  type/author    .code:n = { \int_set:Nn \l_autype_int { 0 } },
  type/editor    .code:n = { \int_set:Nn \l_autype_int { 1 } },
  type/collab    .code:n = { \int_set:Nn \l_autype_int { 2 } },
  type/anon      .code:n = { \int_set:Nn \l_autype_int { 3 } },
  % type/collab    .bool_set:N = \l_ceur_au_collab_bool          ,
  % type/anon      .bool_set:N = \l_ceur_au_anon_bool            ,
  anon      .bool_set:N = \l_ceur_au_anon_bool        ,
  deceased  .bool_set:N = \l_ceur_au_deceased_bool    ,
  twitter   .tl_set:N   = \l_ceur_au_twitter_tl       ,
  facebook  .tl_set:N   = \l_ceur_au_facebook_tl      ,
  linkedin  .tl_set:N   = \l_ceur_au_linkedin_tl      ,
  plus      .tl_set:N   = \l_ceur_au_gplus_tl         ,
  gplus     .tl_set:N   = \l_ceur_au_gplus_tl         ,
  email     .tl_set:N   = \l_ceur_au_email_tl         ,
  %% prevent URL expansion (due ~ sign)
  url       .code:n   = { \tl_set:Nn \l_ceur_au_url_tl { \exp_not:n { #1 } } },
}

\keys_set:nn { ceur / author } {
  auid       = {} ,
  bioid      = {} ,
  alt        = {} ,
  style      = { normal } ,
  prefix     = {} ,
  suffix     = {} ,
  degree     = {} ,
  role       = {} ,
  orcid      = {} ,
  collab     = { false }  ,
  type       = { author } ,
  anon       = { false }  ,
  deceased   = { false }  ,
  twitter    = {} ,
  facebook   = {} ,
  linkedin   = {} ,
  plus       = {} ,
  gplus      = {} ,
  email      = {} ,
  url        = {} ,
}

\keys_define:nn { ceur / ausetup } {
  type      .choice: ,
  type / authors .meta:n = {
    size   =  \large         ,
    shape  =  \upshape       ,
    weight =  \mdseries      ,
    before =  \bigskipamount ,
    after  =  0pt            ,
    align  =  \raggedright   ,
    color  =  black          ,
    lskip  =  0pt            ,
    rskip  =  0pt            ,
  } ,
  type / collaboration .meta:n = {
    size   =  \Large         ,
    shape  =  \upshape       ,
    weight =  \mdseries      ,
    before =  \bigskipamount ,
    after  =  0pt            ,
    align  =  \raggedright   ,
    color  =  black          ,
    lskip  =  0pt            ,
    rskip  =  0pt            ,
  } ,
  size      .tl_set:N    = \l_ceur_augroup_size_tl      ,
  shape     .tl_set:N    = \l_ceur_augroup_shape_tl     ,
  weight    .tl_set:N    = \l_ceur_augroup_weight_tl    ,
  before    .dim_set:N   = \l_ceur_augroup_before_dim   ,
  after     .dim_set:N   = \l_ceur_augroup_after_dim    ,
  align     .tl_set:N    = \l_ceur_augroup_align_tl     ,
  color     .tl_set:N    = \l_ceur_augroup_color_tl     ,
  lskip     .dim_set:N   = \l_ceur_augroup_lskip_tl     ,
  rskip     .dim_set:N   = \l_ceur_augroup_rskip_tl     ,
}

\DeclareDocumentCommand \ceurAuthorSetup { m } {
  \keys_set:nn { ceur / ausetup } { #1 }
}
\DeclareDocumentCommand \ceurausetup { m } {
  \tl_set:Nn \l_ceur_au_setup_tl {
    \keys_set:nn { ceur / ausetup } { #1 } }
}
\DeclareDocumentCommand \ceurclbsetup { m } {
  \tl_set:Nn \l_ceur_clb_setup_tl {
    \keys_set:nn { ceur / ausetup } { #1 } }
}

\ceurausetup { }
\ceurclbsetup { }

\seq_new:N  \g_ceur_maltese_seq
\seq_new:N  \g_ceur_facebook_seq
\seq_new:N  \g_ceur_twitter_seq
\seq_new:N  \g_ceur_gplus_seq
\seq_new:N  \g_ceur_linkedin_seq

\NewDocumentCommand \twitterauthor { m m } {
  \seq_gput_right:Nn \g_ceur_twitter_seq {
    \parsename { #2 }
    \url{https://twitter.com/\tl_to_str:n{#1}}\space(\eadauthor)
  }
}
\NewDocumentCommand \facebookauthor { m m }
   {
     \seq_gput_right:Nn \g_ceur_facebook_seq
       {
         \parsename { #2 }
         \url{https://www.facebook.com/\tl_to_str:n{#1}}\space(\eadauthor) %
       }
     }
\NewDocumentCommand \gplusauthor { m m }
   {
     \seq_gput_right:Nn \g_ceur_gplus_seq
       {
         \parsename { #2 }
         \url{https://plus.google.com/\tl_to_str:n{#1}}\space(\eadauthor)%
       }
     }
\NewDocumentCommand \linkedinauthor { m m }
   {
     \seq_gput_right:Nn \g_ceur_linkedin_seq
       {
         \parsename { #2 }
         \url{https://www.linkedin.com/profile/view?id=\tl_to_str:n{#1}}%
         \space(\eadauthor)
       }
     }

\NewDocumentCommand \printmaltese { }
    {
      \seq_use:Nn { \g_ceur_maltese_seq } { }
    }
\NewDocumentCommand \printfacebook { }
    {
      \seq_if_empty:NTF \g_ceur_facebook_seq { }
        {
          \tex_def:D \thefootnote{}
          \footnotetext
          {
            \bool_if:NTF \g_ceur_nologo_bool
             { Facebook:\c_space_token }
             { \faIcon{facebook-f}\c_space_token }
            \seq_use:Nn \g_ceur_facebook_seq {,\c_space_token }
          }
        }
      }
\NewDocumentCommand \printtwitter { }
    {
      \seq_if_empty:NTF \g_ceur_twitter_seq { }
        {
          \tex_def:D \thefootnote{}
          \footnotetext
          {
            \bool_if:NTF \g_ceur_nologo_bool
             { Twitter:\c_space_token }
             { \faIcon{twitter}\c_space_token }
            \seq_use:Nn \g_ceur_twitter_seq {,\c_space_token }
          }
        }
      }
\NewDocumentCommand \printgplus { }
    {
      \seq_if_empty:NTF \g_ceur_gplus_seq { }
        {
          \tex_def:D \thefootnote{}
          \footnotetext
          {
            \bool_if:NTF \g_ceur_nologo_bool
             { Google+:\c_space_token }
             { \faIcon{google-plus-g}\c_space_token }
            \seq_use:Nn \g_ceur_gplus_seq {,\c_space_token }
          }
        }
      }
\NewDocumentCommand \printlinkedin { }
    {
      \seq_if_empty:NTF \g_ceur_linkedin_seq { }
        {
          \tex_def:D \thefootnote{}
          \footnotetext
          {
            \bool_if:NTF \g_ceur_nologo_bool
             { LinkedIn:\c_space_token }
             { \faIcon{linkedin-in}\c_space_token }
            \seq_use:Nn \g_ceur_linkedin_seq {,\c_space_token }
          }
        }
      }

\seq_new:N \g_ceur_prelimsau_seq

\csxdef { infoauthors } { }
\csgdef { pdfxauthors } { }

\csgdef { __short_authors_tmp } { }
% Number of person in short authors list
\int_new:N \g_num_short_authors
\g_num_short_authors = 1

\cs_new:Nn \no_break_space: { \nobreak{~} \penalty 10000 }

\RenewDocumentCommand \author { O{} m O{} } {
  \ResetMarks
  \tl_if_blank:nTF { #3 } { }
  { \keys_set:nn { ceur / author } { #3 } }
  % 
  \int_gincr:N \g_ceur_au_int
  \tex_gdef:D \theau@ { \int_use:N \g_ceur_au_int }
  % 
  \seq_gput_right:Nn \g_ceur_prelimsau_seq { #2 }
  \bool_if:NTF \l_ceur_au_collab_bool
  { \seq_gput_right:cn { g_ceur_clau\int_use:N \g_ceur_augr_int _seq } }
  { \seq_gput_right:cn { g_ceur_au\int_use:N \g_ceur_augr_int _seq } }
  {
    \int_gincr:N \g_ceur_aau_int
    \tex_gdef:D \theauthor {\int_use:N \g_ceur_aau_int }
    \keys_set:nn { ceur / author } { #3 }
    \tl_if_head_eq_catcode:nNTF { #1 } a
    { \processAffRef { #1 } }
    { \processAffNum { #1 } }
    \tl_if_empty:NF \l_ceur_au_prefix
    { \l_ceur_au_prefix_tl \c_space_token }
    \str_if_eq:VnTF \l_ceur_au_style_tl  { chinese } {
      % \msg_term:n {STYLE~T=\l_ceur_au_style_tl........}
      \invparsename { #2 }
      \textcolor{\l_ceur_augroup_color_tl}{\surname}
      \no_break_space:
      \textcolor{\l_ceur_augroup_color_tl !50}{\firstname}
    }{
      % \msg_term:n {STYLE~F=\l_ceur_au_style_tl........}
      \parsename { #2 }
      \textcolor{\l_ceur_augroup_color_tl !50}{\firstname}
      \no_break_space:
      \textcolor{\l_ceur_augroup_color_tl}{\surname}
    }
    \tl_if_empty:NF \l_ceur_au_suffix_tl
    { \c_space_token \l_ceur_au_suffix_tl }
    \unskip
    \textsuperscript
    {
      \tl_if_blank:nTF { #1 }
      { \tex_def:D \sep{} }
      { {\itshape\listAff} \tex_def:D \sep{\unskip,} }
      \process@marks
      \bool_if:NT \l_ceur_au_deceased_bool
      { \sep \maltese
        \tex_def:D \sep { \unksip, }
      }
    }
    \tl_if_empty:NF \l_ceur_au_degree_tl
    { ,\c_space_token \l_ceur_au_degree_tl }
    \tl_if_empty:NF \l_ceur_au_role_tl
    { \c_space_token (\l_ceur_au_role_tl) }
    % 
    \ResetMarks
  }
  % 
  \bool_if:NT \l_ceur_au_deceased_bool
  {
    \seq_gput_right:Nn \g_ceur_maltese_seq
    {
      \tex_def:D \thefootnote { \maltese }
      \footnotetext{Deceased~author.}
    }
  }
  \tl_if_empty:NF \l_ceur_au_email_tl {
    \wrAux { \token_to_str:N \emailauthor
      { \l_ceur_au_email_tl } { \exp_not:n {#2} } }
  }
  \tl_set:Nx \l_ceur_au_url_tl_tmp { \l_ceur_au_url_tl }
  \tl_if_empty:NF \l_ceur_au_url_tl_tmp {
    \wrAux { \token_to_str:N \urlauthor
      { \l_ceur_au_url_tl } { \exp_not:n {#2} } }
  }
  % various social media
  \tl_if_empty:NTF \l_ceur_au_facebook_tl { }
  {
    \wrAux { \token_to_str:N \facebookauthor
      { \l_ceur_au_facebook_tl } { \exp_not:n {#2} } }
  }
  \tl_if_empty:NF \l_ceur_au_twitter_tl
  {
    \wrAux { \token_to_str:N \twitterauthor
      { \l_ceur_au_twitter_tl } { \exp_not:n {#2} } }
  }
  \tl_if_empty:NF \l_ceur_au_gplus_tl
  {
    \wrAux { \token_to_str:N \gplusauthor
      { \l_ceur_au_gplus_tl } { \exp_not:n {#2} } }
  }
  \tl_if_empty:NF \l_ceur_au_linkedin_tl
  {
    \wrAux { \token_to_str:N \linkedinauthor
      { \l_ceur_au_linkedin_tl } { \exp_not:n {#2} } }
  }
  \tl_if_empty:NF \l_ceur_au_orcid_tl
  {
    \wrAux { \token_to_str:N \orcidauthor
      { \l_ceur_au_orcid_tl } { \exp_not:n {#2} } }
  }
  % Short authors list
  \csgdef { __short_authors_tmp } { #2 }
  \int_compare:nNnTF { \theau@ } = { 1 } {
    \xappto \__short_authors: { \__short_authors_tmp }
  }{ 
    \int_compare:nNnTF { \theau@ } < { \g_num_short_authors + 1 } {
      \xappto \__short_authors: { , ~ \__short_authors_tmp }
    }{
      \int_compare:nNnTF { \theau@ } = { \g_num_short_authors + 1 } {
        \xappto \__short_authors: { ~et~al. }
      }{ }
    }
  }
  % 
  \@eadauthor={#2}
  \pdfstringdef\__info_au: { #2 }
  \int_compare:nNnTF { \theau@ } < { 4 }
  { \xappto \infoauthors { \__info_au: , ~ } }
  {
    \int_compare:nNnTF { \theau@ } = { 4 }
    { \xappto \infoauthors { et~al. } }
    { }
  }
  % Authors list for PDF/A
  \csgdef { __pdfxauthor } { #2 }
  \int_compare:nNnTF { \theau@ } = { 1 }
  { \xappto \pdfxauthors { \detokenize\expandafter{\__pdfxauthor} } }
  { \xappto \pdfxauthors { \iow_char:N \\ sep ~ \detokenize\expandafter{\__pdfxauthor} } }
}

\NewDocumentCommand \ceurauthors { } {
  \group_begin:
  \ceurAuthorSetup { type = authors }
  \l_ceur_au_setup_tl
  \par \vskip\l_ceur_augroup_before_dim
  \l_ceur_augroup_align_tl
  \l_ceur_augroup_size_tl
  \l_ceur_augroup_shape_tl
  \l_ceur_augroup_weight_tl
  \color{ \l_ceur_augroup_color_tl }
  \bool_if:NTF \g_ceur_augr_bool
  { \seq_use:Nn \g_ceur_augr_seq { \par } }
  {
    \seq_use:cnnn { g_ceur_au\int_use:N\g_ceur_augr_int _seq }
    { ,~ } { ,~ } { ~and~ }
  }
  \par\vskip\l_ceur_augroup_after_dim
  \group_end:
}

\seq_new:c { g_ceur_collab0_seq }
\bool_new:N \g_ceur_in_clau_bool

\NewDocumentCommand \ceurcollab { } {
  \bool_if:NTF \g_ceur_augr_bool
  { }
  {
    \group_begin:
    \ceurAuthorSetup { type = collaboration }
    \l_ceur_clb_setup_tl
    \par \vskip \l_ceur_augroup_before_dim
    \l_ceur_augroup_align_tl
    \l_ceur_augroup_size_tl
    \l_ceur_augroup_shape_tl
    \l_ceur_augroup_weight_tl
    \color{ \l_ceur_augroup_color_tl }
    \seq_use:cn {g_ceur_collab\int_use:N \g_ceur_aaugr_int _seq} { }
    \seq_use:cnnn {g_ceur_clau\int_use:N \g_ceur_aaugr_int _seq}
    { ~and~ } { ,~ } { ~and~ }
    \par \vskip \l_ceur_augroup_after_dim
    \group_end:
  }
}

\newenvironment{collaboration}[1][] {
  \seq_gput_right:cn {g_ceur_collab\int_use:N \g_ceur_augr_int _seq}
  { \textit{Collaboration:~} #1 \par \smallskip }
}{
}

\NewDocumentCommand \dept  { m } { #1 }
\NewDocumentCommand \divn  { m } { #1 }
\NewDocumentCommand \aline { m } { #1 }
\NewDocumentCommand \city  { m } { #1 }
\NewDocumentCommand \cnty  { m } { #1 }
\NewDocumentCommand \phone { m } { #1 }
\NewDocumentCommand \fax   { m } { #1 }
\NewDocumentCommand \aurl  { m } { #1 }

\seq_new:c { g_ceur_aff0_seq }
\int_new:N \g_ceur_aff_int
\tl_new:N \l_addrtype_tl

\keys_define:nn { ceur / address }
   {
     foot     .bool_gset:N  = \g_ceur_addr_foot_bool       ,
     name     .tl_set:N    = \l_ceur_addr_name_tl          ,
     type     .multichoice:                               ,
      type/alt     .code:n = { \tl_set:Nn \l_ceur_addr_type_tl
          { Alternate~address } }  ,
      type/addl    .code:n = { \tl_set:Nn \l_ceur_addr_type_tl
          { Additional~address } } ,
      type/regular .code:n = { \tl_set:Nn \l_ceur_addr_type_tl
          {  } } ,
      type/custom  .code:n = { \tl_set:Nn \l_ceur_addr_type_tl
          { \l_ceur_addr_name_tl } } ,
   }
\DeclareDocumentCommand \ceurAddrSetup { m  }
   { \keys_set:nn { ceur / address } { #1 } }

\keys_set:nn { ceur / address }
{
  foot       = { false }   ,
  type       = { regular } ,
  name       = { Alternate~address } ,
}

\cs_new:Nn \__reset_addr:
{
  \bool_gset_false:N \g_ceur_addr_foot_bool
  \tl_set:Nn \l_ceur_addr_type_tl {  }
  \tl_set:Nn \l_ceur_addr_name_tl { Alternate~address }
}

\seq_new:N \g_ceur_aff_foot_seq

\NewDocumentCommand \printaddrinfoot { }
{
  { \seq_use:Nn \g_ceur_aff_foot_seq { \par } }
}

\NewDocumentCommand \address { O{} m O{} }
{
  \__reset_addr:
  \keys_set:nn { ceur / address } { #3 }
  \bool_if:NTF \g_ceur_addr_foot_bool
  { \__foot_address:nnn [#1]{#2}[#3] }
  {
    \seq_gput_right:cn { g_ceur_aff\int_use:N \g_ceur_augr_int _seq }
    { \tl_if_blank:nTF { #1 }
      {
        \tex_xdef:D \thefootnote{}
        { #2 }
      }
      {
        \tl_if_head_eq_catcode:nNTF { #1 } a
        {
          \int_gincr:N \g_ceur_aff_int
          \tex_xdef:D \@currentlabel
          %% label format:
          %% \int_to_arabic:n
          %% \int_to_alph:n
          %% \int_to_symbols:nnn
          %% \int_to_roman:n
          { \int_to_arabic:n { \int_use:N \g_ceur_aff_int } }
          \ceurLabel {#1}
          \textsuperscript{\itshape\@currentlabel} #2
        }
        {
          \int_gset:Nn \g_ceur_aff_int { #1 }
          \tex_xdef:D \@currentlabel
          { \int_to_arabic:n {  \int_use:N \g_ceur_aff_int } }
          \textsuperscript{\itshape\@currentlabel} #2
        }
      }
    }
  }
}

\cs_new:Npn \__foot_address:nnn [#1]#2[#3]
{
  \keys_set:nn { ceur / address } { #3 }
  \seq_gput_right:cn { g_ceur_aff_foot_seq }
  {
    \tl_if_empty:nTF { #1 }
    {
      \tl_if_empty:NTF \l_ceur_addr_type_tl
      { \footnotetext{#2} }
      {
        \footnotetext{\textit{\l_ceur_addr_type_tl}:
          \c_space_token #2 }
      }
    }
    {
      \tl_if_head_eq_catcode:nNTF { #1 } a
      %
      {
        \tex_def:D \thefootnote{\itshape\@currentlabel}
        \tl_if_empty:NTF \l_ceur_addr_type_tl
        { \footnotetext{#2} }
        { \footnotetext{\textit{\l_ceur_addr_type_tl}: \c_space_token #2} }
      }
      {
        \tex_def:D \thefootnote { \itshape\int_to_arabic:n { #1 } }
        \tl_if_empty:NTF \l_ceur_addr_type_tl
        { \footnotetext{#2} }
        { \footnotetext{\textit{\l_ceur_addr_type_tl}:
            \c_space_token #2 } }
      }
    }
  }
}

\keys_define:nn { ceur / affsetup }
   {
     type      .choice: ,
     type / normal .code:n =
       { \tl_set:Nn \l_ceur_aff_type_tl { 0 } } ,
     type / nonum .code:n =
       { \tl_set:Nn \l_ceur_aff_type_tl { 1 } } ,

     size      .tl_set:N    = \l_ceur_aff_size_tl      ,
     shape     .tl_set:N    = \l_ceur_aff_shape_tl     ,
     weight    .tl_set:N    = \l_ceur_aff_weight_tl    ,
     before    .dim_set:N   = \l_ceur_aff_before_dim   ,
     after     .dim_set:N   = \l_ceur_aff_after_dim    ,
     align     .tl_set:N    = \l_ceur_aff_align_tl     ,
     color     .tl_set:N    = \l_ceur_aff_color_tl     ,
     lskip     .dim_set:N   = \l_ceur_aff_lskip_dim    ,
     rskip     .dim_set:N   = \l_ceur_aff_rskip_dim    ,
   }

\DeclareDocumentCommand \ceurAffSetup { m }
   { \keys_set:nn { ceur / affsetup } { #1 } }
\DeclareDocumentCommand \ceuraffsetup { m }
   { \tl_set:Nn \l_ceur_aff_setup_tl
     { \keys_set:nn { ceur / affsetup } { #1 } }
   }
\ceuraffsetup {
    size   = \footnotesize,
    shape  = \itshape,
    color  = black,
    before = 0pt,
    weight = \mdseries,
    align  = \raggedright,
    }

\NewDocumentCommand \ceuraddress { }
   {
     \bool_if:NTF \g_ceur_augr_bool
     { }
     {
       \group_begin:
       \ceurAffSetup { type = normal }
       \l_ceur_aff_setup_tl
       \par \vskip\l_ceur_aff_before_dim
       \l_ceur_aff_align_tl
       \l_ceur_aff_size_tl
       \l_ceur_aff_shape_tl
       \l_ceur_aff_weight_tl
       \color{ \l_ceur_aff_color_tl }
       \seq_use:cn { g_ceur_aff\int_use:N \g_ceur_aaugr_int _seq }
       { \par\vskip2pt  }
       \par\vskip\l_ceur_aff_after_dim
       \group_end:
     }
   }

\int_new:N \g_ceur_augr_int
\seq_new:N \g_ceur_augr_seq
\int_new:N \g_ceur_aaugr_int
\bool_new:N \g_ceur_augr_bool

\NewDocumentEnvironment { augroup } { }
{
  \bool_gset_true:N \g_ceur_augr_bool
  \int_gincr:N \g_ceur_augr_int
  \seq_new:c {g_ceur_au\int_use:N \g_ceur_augr_int _seq}
  \seq_new:c {g_ceur_aff\int_use:N \g_ceur_augr_int _seq}
  \seq_new:c {g_ceur_collab\int_use:N \g_ceur_augr_int _seq}
  \seq_new:c {g_ceur_clau\int_use:N \g_ceur_augr_int _seq}
  \msg_term:n { AUGR:~\int_use:N \g_ceur_augr_int ... }
}
{
  \seq_gput_right:Nn \g_ceur_augr_seq
  {
    \int_gincr:N \g_ceur_aaugr_int
    \group_begin:
    \ceurAuthorSetup { type = collaboration }
    \l_ceur_clb_setup_tl
    \par \vskip \l_ceur_augroup_before_dim
    \l_ceur_augroup_align_tl
    \l_ceur_augroup_size_tl
    \l_ceur_augroup_shape_tl
    \l_ceur_augroup_weight_tl
    \color{ \l_ceur_augroup_color_tl }
    \seq_use:cnnn { g_ceur_au\int_use:N \g_ceur_aaugr_int _seq }
    { ~and~ } { ,~ } { ~and~ }
    \par \vskip \l_ceur_augroup_after_dim
    \group_end:
    %
    \group_begin:
    \ceurAffSetup { type = normal }
    \l_ceur_aff_setup_tl
    \par \vskip\l_ceur_aff_before_dim
    \l_ceur_aff_align_tl
    \l_ceur_aff_size_tl
    \l_ceur_aff_shape_tl
    \l_ceur_aff_weight_tl
    \color{ \l_ceur_aff_color_tl }
    \seq_use:cn { g_ceur_aff\int_use:N \g_ceur_aaugr_int _seq }
    { \par \smallskip }
    \par\vskip\l_ceur_aff_after_dim
    \msg_term:n { AAUGR:~\int_use:N \g_ceur_aaugr_int ... }
    \group_end:
    %
    \group_begin:
    \ceurAuthorSetup { type = collaboration }
    \l_ceur_clb_setup_tl
    \par \vskip \l_ceur_augroup_before_dim
    \l_ceur_augroup_align_tl
    \l_ceur_augroup_size_tl
    \l_ceur_augroup_shape_tl
    \l_ceur_augroup_weight_tl
    \color{ \l_ceur_augroup_color_tl }
    \seq_use:cn {g_ceur_collab\int_use:N \g_ceur_aaugr_int _seq} { }
    \seq_use:cnnn {g_ceur_clau\int_use:N \g_ceur_aaugr_int _seq}
    { ~and~ } { ,~ } { ~and~ }
    \par\vskip \l_ceur_augroup_after_dim
    \group_end:
  }
}

%%
%% Abstract
%%

\RequirePackage{moreverb}

\tl_new:N \l_ceur_abs_title_tl
\box_new:N \g_ceur_abs_box

\tex_gdef:D \abstractname { \textbf{\sffamily Abstract} }

\NewDocumentEnvironment { Abstract } { o } {
  % \global\setbox \g_ceur_abs_box = \vtop \bgroup
  % \hsize = .65 \textwidth \parindent \z@
  \group_begin:
  % Check if abstract exist
  \file_if_exist:nT { \jobname.abs } { 
    \IfNoValueTF { #1 } {
    } { \tex_gdef:D \abstractname { #1 } }
    \parindent \z@
    \leftskip = .1 \textwidth
    % \box_if_empty:NTF \g_ceur_key_box
    % { \leftskip = .1 \textwidth }
    % {
    % \dim_gset:Nn \l_tmpa_dim { \box_ht:N \g_ceur_key_box }
    % \dim_gadd:Nn \l_tmpa_dim { \box_dp:N \g_ceur_key_box }
    % \leftskip .1\textwidth
    % \hspace*{-.1 \textwidth }
    % \noindent\hbox_to_wd:nn {  \z@ } { \box \g_ceur_key_box }
    % \skip_vertical:n { - \l_tmpa_dim }
    % }
    \skip_vertical:n { \baselineskip }
    % \noindent \abstractname \par
    \noindent { \textbf{\sffamily Abstract} } \par
    % \skip_vertical:n { -4pt}
    % \noindent \rule{.65\textwidth}{.2pt}\par
    \footnotesize
    \ignorespaces \everypar { \parindent=1.5em }
  } { }
} {
  \par
  \noindent\hbox_to_wd:nn { \z@ } { \box \g_ceur_key_box }
  \par \group_end:
}

\NewDocumentEnvironment { PrelimsAbstract } { O{} } {
  \parindent=0pt
  { \fontsize{14pt}{16pt}\selectfont #1 }\par
  \vskip12pt
  { \fontsize{12pt}{14pt}\bfseries\selectfont\casprelimstitle } \par
  \vskip6pt
  \seq_use:Nn \g_ceur_prelimsau_seq { , }
  \vskip12pt
  \par
} { }

\RenewDocumentEnvironment { abstract } { o } {
  \IfNoValueTF { #1 } {
  } { \tex_gdef:D \abstracttitle { #1 } }
  \verbatimwrite{\jobname.abs}
} { \endverbatimwrite }

\newbox\casgrabsbox
\newbox\casauhlbox
\newbool { usecasgrabsbox }
\newbool { usecashlsbox }

\DeclareDocumentEnvironment { graphicalabstract } { O{Graphical~Abstract} } {
  \global \booltrue { usecasgrabsbox }
  \global\setbox\casgrabsbox=\vbox\bgroup
  \begin{PrelimsAbstract}[#1]
  \noindent \ignorespaces
} {
  \end{PrelimsAbstract}
  \egroup
}

\DeclareDocumentEnvironment { highlights } { O{Highlights} } {
  \global \booltrue { usecashlsbox }
  \global\setbox\casauhlbox=\vbox\bgroup
  \begin{PrelimsAbstract}[#1]
  \noindent \ignorespaces
  \begin{itemize}
} {
  \end{itemize}
  \end{PrelimsAbstract}
  \egroup
}

\NewDocumentCommand \dashrule { O{.4pt} m m }
   {
     % \color{black!50}
     \skip_vertical:n { #2 }
     % \noindent \rule { \linewidth } { #1}
     \normalcolor \skip_vertical:n { #3 }
   }

\NewDocumentCommand \keywordtitle { } { Keywords }
\NewDocumentCommand \keywordtitlesep { } {:\c_space_token }
\box_new:N \g_ceur_key_box

\NewDocumentCommand \MSC { O{} m }
   {
     \par\noindent \textit { #1\c_space_token MSC:\c_space_token } #2
   }
\NewDocumentCommand \JEL { m }
   {
     \par\noindent \textit { JEL:\c_space_token } #1
   }
\NewDocumentCommand \PACS { m }
   {
     \par\noindent \textit { PACS:\c_space_token } #1
   }

\NewDocumentEnvironment { keywords } { +b } {
  %% Keywords list for PDF/A
  \csgdef { pdfxkeywords } { \detokenize\expandafter{ #1 } }
  %% replace \sep by commas 
  \tex_global:D \tex_setbox:D \g_ceur_key_box = \vtop \bgroup
  \hsize=.9 \textwidth
  \vspace*{0pt}
  \cs_new:Nn \sep: {\unskip,~}
  \cs_set_eq:NN \sep \sep:
  %% Environment block
  \parindent \z@
  \noindent \textbf {\sffamily \keywordtitle }  \par
  \footnotesize
  #1
  \skip_vertical:n { \baselineskip }
  \egroup
} { }

%% Acknowledgments

\NewDocumentEnvironment { acknowledgments } { }
{
  \group_begin:
  \section*{Acknowledgments}
}
{ \group_end: }


%% Copyright

\def\copyrightyear#1{\def\@copyrightyear{#1}}
\copyrightyear{\the\year}

\DeclareRobustCommand\copyrightclause[1]{%
  \def\@copyrightclause{#1}%
}
\let\@copyrightclause\@empty
% \copyrightclause{\textcolor{red}{Author: Please provide a copyright holder}}


%% CC-BY logo width
\newdimen\ccLogoWidth

\def\@copyrightLine{%
  \setbox\@tempboxa\hbox{\includegraphics[height=\baselineskip,clip]{cc-by}}%
  \ccLogoWidth=\dimexpr\wd\@tempboxa
  \@rightskip\@flushglue \rightskip\@rightskip
  % \hangindent\dimexpr\wd\@tempboxa+0.5em\relax
  \begin{minipage}[c]{\ccLogoWidth}
    \href{https://creativecommons.org/licenses/by/4.0}%
    {\lower\baselineskip\hbox{\unhcopy\@tempboxa}}\enskip
  \end{minipage}
  \nobreak\enskip
  \begin{minipage}[c]{\linewidth - \ccLogoWidth - 2\footnotemargin}
    \tiny
    \textcopyright\ \@copyrightyear\ %
    \ifx\@copyrightclause\@empty%
      \textcolor{red}{Author: Please fill in the \string\copyrightclause\space macro}%
    \else\@copyrightclause%
    \fi
  \end{minipage}
}

\RequirePackage{calc}

\def\@ceurLogoLine{%
  % set width of ceur-ws logo equals to width of cc-by logo
  \setbox\@tempboxa\hbox{\includegraphics[height=\baselineskip,clip]{cc-by}}%
  \ccLogoWidth=\dimexpr\wd\@tempboxa
  \setbox\@tempboxa\hbox{\includegraphics[width=\ccLogoWidth,clip]{ceur-ws-logo}}
  \@rightskip\@flushglue \rightskip\@rightskip
  % \hangindent\dimexpr\wd\@tempboxa+0.5em\relax
  \begin{minipage}[c]{\ccLogoWidth}
    \href{https://ceur-ws.org}%
    % {\lower\baselineskip\hbox{\unhcopy\@tempboxa}}\enskip
    {\hbox{\unhcopy\@tempboxa}}
  \end{minipage}
  \nobreak\enskip
  \begin{minipage}[c]{\linewidth - \ccLogoWidth - 2\footnotemargin}
    {CEUR~Workshop~Proceedings~(\href{https://ceur-ws.org}{CEUR-WS.org})}%
  \end{minipage}
}

\seq_new:N \g_ceur_logonote_seq

\NewDocumentCommand \logonote { m } {
  \group_begin:
  \seq_gput_right:Nn \g_ceur_logonote_seq
  {
    \tex_def:D \thefootnote { }
    \footnotetext{%
      \raggedright
      \hspace*{-\parindent}
      % \hspace*{-\labelsep}
      \hspace*{-\footnotemargin}
      #1}
  }
  \group_end:
}

\newcommand \printlogonotes { \seq_use:Nn \g_ceur_logonote_seq { \par } }

%
% Print all footnotes in the title page
%

\bool_new:N \g_ceur_longmktitle_bool
\int_new:N \g_ceur_jtype_int
\int_new:N \g_ceur_blind_int

\NewDocumentCommand \printFirstPageNotes { } {
  \bool_if:NTF \g_ceur_longmktitle_bool {
    \tex_let:D \columnwidth = \textwidth
  } { }
  \int_compare:nTF { \g_ceur_jtype_int > 5 } {
    \ceuraddress
  } { }
  \printnonumnotes
  \printtnotes
  \bool_if:NTF \g_ceur_blind_bool {
  } {
    \printcornotes
    \printfnotes
    \printmaltese
    \printaddrinfoot
    \printemails
    \printurls
    \printorcid
    \printfacebook
    \printtwitter
    \printgplus
    \printlinkedin
  }
  \printlogonotes
  \bool_if:NTF \g_ceur_longmktitle_bool {
    \if@twocolumn
      \tex_let:D \columnwidth = \Columnwidth \fi
  } { }
  \normalcolor
}

%
% Date History
%
\tl_new:N \g_ceur_recd_tl
\tl_new:N \g_ceur_accd_tl
\tl_new:N \g_ceur_revd_tl
\tl_new:N \g_ceur_pub_online_tl
\tl_new:N \g_ceur_pub_print_tl

\cs_new:Npn \date_parse:n #1 { \date_parse_aux:w #1 \q_stop }
\cs_new:Npn \date_parse_aux:w #1 / #2 / #3 \q_stop
{ <do something with the date> }

\NewDocumentCommand \received { m }
    { \tl_gput_right:Nn \g_ceur_recd_tl { #1 } }
\NewDocumentCommand \accepted { m }
    { \tl_gput_right:Nn \g_ceur_accd_tl { #1 } }
\NewDocumentCommand \revised { m }
    { \tl_gput_right:Nn \g_ceur_revd_tl { #1 } }
\NewDocumentCommand \published { O{} m }
{
  \tl_if_eq:nnTF { #1 } { online }
  { \tl_if_gput_right:Nn \g_ceur_pub_online_tl { #2 } }
  { \tl_if_gput_right:Nn \g_ceur_pub_print_tl { #2 } }
}

%
% Verse/Recto
%
\tl_new:N \l_ceur_verso_tl
\tl_new:N \l_ceur_recto_tl

\NewDocumentCommand \verso { m }
{ \tl_set:Nn \l_ceur_verso_tl { #1 } }
\NewDocumentCommand \recto { m }
{ \tl_set:Nn \l_ceur_recto_tl { #1 } }

%
% Maketitle
%

\newcounter{au}
\newcounter{cnote}
\newcounter{tnote}
\newcounter{fnote}
\newcounter{aff}

\cs_new:Nn \__reset_title_counters:
{
  \setcounter{cnote}{0}
  \setcounter{fnote}{0}
  \setcounter{tnote}{0}
  \setcounter{footnote}{0}
}

\keys_define:nn { ceur / mktitle }
{
  blind        .bool_gset:N     = \g_ceur_blind_bool        ,
  footer       .multichoice:,
       footer/default  .tl_gset:N  = \g_ceur_footer_default_tl ,
       footer/custom   .tl_gset:N  = \g_ceur_footer_custom_tl  ,
  longtitle     .bool_gset:N    = \g_ceur_longtitle_bool    ,
  longabstract  .bool_gset:N    = \g_ceur_longtitle_bool    ,
  breakafter    .clist_gset:N   = \g_ceur_breakafter_clist  ,
  nologo        .bool_gset:N    = \g_ceur_nologo_bool       ,
}

\bool_new:N \g_ceur_breakafter_title_bool
\bool_new:N \g_ceur_breakafter_auaff_bool
\bool_new:N \g_ceur_breakafter_abstract_bool

\NewDocumentCommand \processbreakafter { }
{
  \clist_if_empty:NTF \g_ceur_breakafter_clist { }
  {
    \clist_map_inline:Nn \g_ceur_breakafter_clist
    { \bool_gset_true:c { g_ceur_breakafter_##1_bool } }
  }
}

\NewDocumentCommand \pprintMaketitle { O{} }
{
  \tl_if_blank:nTF { #1 } { }
  { \keys_set:nn { ceur / mktitle } { #1 } }
  \processbreakafter
  \clearpage
  \__reset_title_counters:
  \tex_def:D \baselinestretch { 1 }
  \printFirstPageNotes
  \thispagestyle{pprintTitle}%
  \group_begin:
  \@title
  \group_end:
  \bool_if:NTF \g_ceur_breakafter_title_bool
  { \newpage } { }
  %
  \bool_if:NTF \g_ceur_blind_bool
  { \vspace* { 10 mm } }
  {
    \group_begin:
    \normalsize \ceurauthors \par
    \ceurcollab \par
    \footnotesize \itshape \ceuraddress \par \vskip36pt
    \group_end:
    \bool_if:NTF \g_ceur_breakafter_auaff_bool
    { \newpage } { }
  }
  %
  \printabsbox
  \printkeybox
  \bool_if:NTF \g_ceur_breakafter_abstract_bool
  { \newpage } { }
  %
  \setcounter{footnote}{\c@fnote}
  \tex_gdef:D \thefootnote { \arabic{footnote} }
  \tex_def:D \baselinestretch { \@blstr }
  \normalfont \normalsize
}

\NewDocumentCommand \MaketitleBox { } {
  \tex_def:D \baselinestretch{1}
  \group_begin:
  \@title
  \group_end:
  % 
  \bool_if:NTF \g_ceur_blind_bool {
    \vspace* { 10 mm }
  } {
    \group_begin:
    \normalsize \ceurauthors \par
    \ceurcollab \par
    \footnotesize \itshape \ceuraddress \par
    \group_end:
    \bool_if:NTF \g_ceur_breakafter_auaff_bool
    { \newpage } { }
  }
  % \printFirstPageNotes
  %
  \dashrule{0pt}{3pt}
  \begin{Abstract}
    \noindent \ignorespaces
    \file_if_exist:nT { \jobname.abs } { \file_input:n { \jobname.abs } }
  \end{Abstract}
  \dashrule{6pt}{3pt}
  \bool_if:NTF \g_ceur_breakafter_abstract_bool
  { \newpage } { }
}

\box_new:N \g_ceur_notes_box
\box_new:N \g_ceur_front_box
\cs_set:Npn \__fn_text:n #1
{ \group_begin:\vbox_top:n { \footnotesize #1 } \group_end:\par}

\NewDocumentCommand \LongMaketitleBox { }
{
  \vbox_gset:Nn \g_ceur_front_box
  {
    \tex_def:D \baselinestretch{1}
    \group_begin:
    \@title
    \group_end:
    %
    \group_begin:
    \normalsize \ceurauthors \par
    \ceurcollab \par
    \footnotesize \itshape \ceuraddress \par
    \group_end:
  %
  \dashrule{0pt}{3pt}
  \begin{Abstract}
    \noindent \ignorespaces
    \file_if_exist:nT { \jobname.abs } { \file_input:n { \jobname.abs } }
  \end{Abstract}
  \dashrule{3pt}{3pt}
  }
  \vbox_gset:Nn \g_ceur_notes_box
  {  \cs_set_eq:NN \footnotetext \__fn_text:n  \printFirstPageNotes }
   \dim_gset:Nn \g_tmpb_dim { \box_ht:N \g_ceur_notes_box }
   % \iow_term:x { ...~[ht: \dim_use:N \g_tmpb_dim  ] }
   \dim_gadd:Nn \g_tmpb_dim { \box_dp:N \g_ceur_notes_box }
   % \iow_term:x { ...~[ht+dp: \dim_use:N \g_tmpb_dim  ] }
   \ifbool{sc}{\dim_gadd:Nn \g_tmpb_dim { 12pt } } { }

}

\NewDocumentCommand \ProcessLongTitleBox { }
{
  % \vbox_gset:Nn \g_ceur_notes_box
  % {  \cs_set_eq:NN \footnotetext \__fn_text:n \printFirstPageNotes }
  %  \dim_gset:Nn \g_tmpb_dim { \box_ht:N \g_ceur_notes_box }
  % % \iow_term:x { ...~[ht: \dim_use:N \g_tmpb_dim  ] }
  %  \dim_gadd:Nn \g_tmpb_dim { \box_dp:N \g_ceur_notes_box }
  % % \iow_term:x { ...~[ht+dp: \dim_use:N \g_tmpb_dim  ] }
  %
  \dim_gset:Nn \g_tmpa_dim { \textheight }
%  \vbox_unpack:N \g_ceur_notes_box
  % \iow_term:x { ...~[tmpa:~ \dim_use:N \g_tmpa_dim ] }
  % \dim_gsub:Nn \g_tmpa_dim { \box_ht:N \g_ceur_notes_box }
  % \iow_term:x { ...~[tmpa-noteht:~ \dim_use:N \g_tmpa_dim ] }
  % \dim_gsub:Nn \g_tmpa_dim { \box_dp:N \g_ceur_notes_box }
  % \iow_term:x { ...~[tmpa-notedp:~ \dim_use:N \g_tmpa_dim ] }
  \dim_gsub:Nn \g_tmpa_dim { \g_tmpb_dim }
  \vbox_set_split_to_ht:NNn \g_tmpb_box \g_ceur_front_box { \g_tmpa_dim }
  \noindent \vbox_unpack_clear:N \g_tmpb_box
  \printFirstPageNotes
  \dim_gzero:N \g_tmpa_dim
  \dim_gset:Nn \g_tmpa_dim { \box_ht:N \g_ceur_front_box }
  % \iow_term:x { ...~[tmpa-ht:~ \dim_use:N \g_tmpa_dim ] }
  \dim_gadd:Nn \g_tmpa_dim { \box_dp:N \g_ceur_front_box }
  % \iow_term:x { ...~[tmpa-ht+dp:~ \dim_use:N \g_tmpa_dim ~+~\the\textheight] }
  \dim_compare:nNnTF { \dim_use:N \g_tmpa_dim } > { \the\textheight }
  {
    \vbox_set_split_to_ht:NNn \g_tmpb_box \g_ceur_front_box { \textheight }
    \vbox_unpack_clear:N \g_tmpb_box
    \ifbool{dc}
    { \twocolumn[{\vbox_unpack_clear:N \g_ceur_front_box}] }
    { \vbox_unpack_clear:N \g_ceur_front_box }
  }
  {
    \ifbool{dc}
    { \twocolumn[{\vbox_unpack_clear:N \g_ceur_front_box}] }
    { \vbox_unpack_clear:N \g_ceur_front_box }
  }
 \normalcolor \normalfont
}
\ExplSyntaxOff

%
% Headings
%
\def\@seccntDot{.}
\def\@seccntformat#1{\csname the#1\endcsname\@seccntDot\hskip 0.5em}

\newdimen\paraindent     \paraindent=\parindent
\newdimen\subparaindent  \subparaindent=\parindent
\def\ssssparaindent{}
\def\sectionfont{\rmfamily\fontsize{12pt}{14pt}%
  \bfseries}
\def\ssectionfont{\rmfamily\fontsize{11pt}{13pt}%
  \bfseries\selectfont}
\def\sssectionfont{\rmfamily\fontsize{10.5pt}{12pt}%
  \fontseries{b}\fontshape{it}\selectfont}
\def\ssssectionfont{\rmfamily\fontsize{11pt}{10pt}\itshape\selectfont}
\def\sssssectionfont{\rmfamily\fontsize{11pt}{10pt}\selectfont}%

\AtBeginDocument{\global\@afterindentfalse}

% \renewcommand\section{\@startsection{section}{1}{\z@}%
%     {15pt \@plus 3\p@ \@minus 3\p@}%
%     {4\p@}%
%     {%\let\@hangfrom\relax
%      \sectionfont\raggedright\hst[13pt]}}

% \renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
%     {10pt \@plus 3\p@ \@minus 2\p@}%
%     {.1\p@}%
%     {%\let\@hangfrom\relax
%      \ssectionfont\raggedright }}

% \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
%     {10pt \@plus 1\p@ \@minus .3\p@}%
%     {.1\p@}%
%     {%\let\@hangfrom\relax
%      \sssectionfont\raggedright}}

% \renewcommand\paragraph{\@startsection{paragraph}{4}{\parindent}%
%     {10pt \@plus0.01pt \@minus0.01pt}%
%     {-6pt}%
%     {\ssssparaindent%
%      \ssssectionfont\itshape\raggedright}}

% \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
%     {0pt \@plus0.1pt \@minus0.1pt}%
%     {-6pt}%
%     {\hspace*{\subparaindent}
%      \sssssectionfont\raggedright}}

\def\thesubsection{\thesection.\arabic{subsection}}
\def\thesubsubsection{\thesubsection.\arabic{subsubsection}}

%
% Sundry lengths
%
\def\xstrut#1#2{\vrule height#1 depth #2 width\z@}
\def\hstrut#1{\vrule height#1 depth \z@ width 0pt}
\def\dstrut#1{\vrule height0pt depth#1 width 0pt}
\def\hst[#1]{\vrule height#1 depth \z@ width \z@}
\def\dst[#1]{\vrule height0pt depth#1 width 0pt}
\def\xst[#1][#2]{\vrule height#1 depth #2 width\z@}

\def\lastpage{100}

\AtEndDocument{%
%   \clearpage
   \immediate\write\@auxout{\string\csxdef{lastpage}{\thepage}}
}

\ExplSyntaxOn

%
% pagestyle
%

\RequirePackage{scrlayer-scrpage}
\clearpairofpagestyles

\setkomafont{pageheadfoot}{\sffamily\small}
% \setkomafont{pagehead}{\sffamily\small}

\bool_if:NTF \g_ceur_hf_bool {
  \KOMAoptions{headsepline}
  % \ofoot[Page~ \thepage {} ~of~ \lastpage]{Page~ \thepage {} ~of~ \lastpage}
  % \ifoot[\__short_authors: :~ { \rmfamily \itshape CEUR~Workshop~Proceedings}]{\__short_authors: :~ { \rmfamily \itshape CEUR~Workshop~Proceedings}}
  % \ohead[]{\__short_title:}
  \cfoot[\thepage]{\thepage}
  \ohead[]{\firstpage--\lastpage}
  \ihead[]{\__short_authors:{} ~ { \rmfamily \itshape CEUR~Workshop~Proceedings}}
}{ }

% \newcommand{\hffont}{\sffamily\small}

% \RequirePackage{scrlayer-fancyhdr}

% \fancypagestyle{first}{%
%   \fancyhf{}%
%   \renewcommand{\headrulewidth}{\z@}%
%   \renewcommand{\footrulewidth}{\z@}%
%   \fancyfoot[R]{\hffont Page~ \thepage {} ~of~ \lastpage}%
%   \fancyfoot[L]{\hffont \__short_authors: :~ { \rmfamily \itshape CEUR~Workshop~Proceedings}}%
% }  

% \fancypagestyle{standard}{%
%   \fancyhf{}%
%   \renewcommand{\headrulewidth}{\z@}%
%   \renewcommand{\footrulewidth}{\z@}%
%   \fancyfoot[R]{\hffont Page~ \thepage {} ~of~ \lastpage}%
%   \fancyfoot[L]{\hffont \__short_authors: :~ { \rmfamily \itshape CEUR~Workshop~Proceedings}}%
%   \fancyhead[L]{\hffont \__short_title:}%
% }  

\cs_new:Npn \__first_footerline: {
  \group_begin:
  \small \sffamily
  \__short_authors: :~
  { \rmfamily \itshape CEUR~Workshop~Proceedings }
  \group_end:
}

\cs_new:Npn \__first_head: {
  \parbox[t]{\textwidth}
  {
    \color{black!20}
    \rule{\textwidth}{0pt}
  }
}

\cs_new:Npn \__first_foot: {
  \parbox[t]{\textwidth} {
    % \rule{\textwidth}{.2pt}\\
    \sffamily\small
    \__first_footerline:
    \hfill Page~ \thepage {} ~of~ \lastpage
  }
}

\cs_new:Npn \__ceur_head: {
  \parbox{\textwidth} {
    \sffamily\small\centering
    \__short_title:
  }
}

\cs_new:Npn \__ceur_foot: {
  \parbox[t]{\textwidth} {
    % \rule{\textwidth}{.2pt}\\
    \sffamily\small
    \__first_footerline:
    \hfill Page~\thepage {}~of~ \lastpage
  }
}

% \newcommand \ps@first {
%   \cs_set_eq:NN \@oddhead \__first_head:
%   \cs_set_eq:NN \@evenhead \__first_head:
%   \cs_set_eq:NN \@evenfoot \__first_foot:
%   \cs_set_eq:NN \@oddfoot \__first_foot:
% }

% \newcommand \ps@ceur {
%   \cs_set_eq:NN \@oddhead \__ceur_head:
%   \cs_set_eq:NN \@evenhead \__ceur_head:
%   \cs_set_eq:NN \@evenfoot \__ceur_foot:
%   \cs_set_eq:NN \@oddfoot \__ceur_foot:
% }

% \ps@ceur

%
% Floats
%

\def\topfraction{.9}
\def\bottomfraction{.9}
\setcounter{topnumber}{4}
\setcounter{bottomnumber}{3}
\setcounter{totalnumber}{5}
\renewcommand\textfraction{.1}
\renewcommand\floatpagefraction{.9}
\setcounter{dbltopnumber}{2}
\renewcommand\dbltopfraction{.9}
\renewcommand\dblfloatpagefraction{.95}
\newdimen \FullWidth
\FullWidth=\textwidth

\newcolumntype{L}{@{\extracolsep{\fill}}l}
\newcolumntype{R}{@{\extracolsep{\fill}}r}
\newcolumntype{C}{@{\extracolsep{\fill}}c}

\cs_gset_eq:NN \thead  \toprule
\cs_gset_eq:NN \endthead  \midrule
\cs_gset_eq:NN \tabref  \ref

\dim_new:N \l_tbl_width_dim
\dim_set:Nn \l_tbl_width_dim { \linewidth }

\cs_new:Npn \__make_tbl_caption:nn #1#2
{
  \l_tbl_align_tl
  \skip_vertical:N \l_tbl_abovecap_skip
  % \bool_if:NTF \g_tbl_full_bool
  % {
  %  \color{scolor!70}\rule{\FullWidth}{2pt}\normalcolor\\
  % }
  % { \color{scolor!70}\rule{\tblwidth}{2pt}\normalcolor\\ }
  % \fboxsep=4pt
  % \colorbox{white}
  {\parbox{ \dimexpr(\l_tbl_width_dim)}
    {\rightskip=0pt\sffamily\small\textbf{\color{scolor}#1}\par#2\par\vskip4pt }}
  \skip_vertical:N \l_tbl_belowcap_skip
}

\keys_define:nn { ceur / tbl } {
  width     .dim_set:N   =  \l_tbl_width_dim ,
  pos       .tl_set:N    =  \l_tbl_pos_tl ,
  cols      .tl_set:N    =  \l_tbl_cols_tl ,
  align     .tl_set:N    =  \l_tbl_align_tl,
  abovecap  .skip_set:N  =  \l_tbl_abovecap_skip ,
  belowcap  .skip_set:N  =  \l_tbl_belowcap_skip ,
  abovetbl  .skip_set:N  =  \l_tbl_abovetbl_skip ,
  belowtbl  .skip_set:N  =  \l_tbl_belowtbl_skip ,
  full      .bool_gset:N =  \g_tbl_full_bool ,
  unknown   .code:n      =  \tl_set:Nx \l_tbl_pos_tl { \l_keys_key_str },
}

\cs_set:Npn \__reset_tbl: {
  \tl_set:Nx \l_tbl_pos_tl { t }
  \tl_set:Nx \l_tbl_cols_tl { 1 }
  \tl_set:Nn \l_tbl_align_tl { \centering }
  \skip_set:Nn \l_tbl_abovecap_skip { 6pt }
  \skip_set:Nn \l_tbl_belowcap_skip { 0pt }
  \skip_set:Nn \l_tbl_abovetbl_skip { 6pt }
  \skip_set:Nn \l_tbl_belowtbl_skip { 6pt }
}

\RenewDocumentEnvironment { table } { O{} } {
  \__reset_tbl:
  \bool_gset_false:N \g_tbl_full_bool
  \dim_set:Nn \l_tbl_width_dim { \linewidth }
  \keys_set:nn { ceur / tbl } { #1 }
  \csxdef{fps@table}{\l_tbl_pos_tl}
  \csgdef{tblwidth}{\dim_use:N \l_tbl_width_dim}
  \cs_set_eq:NN \@makecaption \__make_tbl_caption:nn
  \@float{table}
  \l_tbl_align_tl
  \sffamily\small
}
{ \end@float }


\RenewDocumentEnvironment { table* } { O{width=\FullWidth} } {
  \__reset_tbl:
  \bool_gset_true:N \g_tbl_full_bool
  \dim_set:Nn \l_tbl_width_dim { \FullWidth }
  \keys_set:nn { ceur / tbl } { #1 }
  \csxdef{fps@table}{\l_tbl_pos_tl}
  \csgdef{tblwidth}{\dim_use:N \l_tbl_width_dim}
  \cs_set_eq:NN \@makecaption \__make_tbl_caption:nn
  \@dblfloat{table}
  \l_tbl_align_tl
  \sffamily\small
  % \leftskip=-\FullWidth
}
{ \end@dblfloat }

\dim_new:N \l_fig_width_dim
\dim_set:Nn \l_fig_width_dim { \linewidth }

\cs_new:Npn \__make_fig_caption:nn #1#2 {
  \l_fig_align_tl
  \skip_vertical:N \l_fig_abovecap_skip
  % \bool_if:NTF \g_fig_full_bool
  % { \skip_horizontal:n { -\FullWidth } } { }
  \parbox{ \l_fig_width_dim }
  {\rightskip=0pt\sffamily\small\textbf{\color{scolor}#1:}~#2\par }
  \skip_vertical:N \l_fig_belowcap_skip
}

\keys_define:nn { ceur / fig } {
  width     .dim_set:N   =  \l_fig_width_dim ,
  pos       .tl_set:N    =  \l_fig_pos_tl ,
  cols      .tl_set:N    =  \l_fig_cols_tl ,
  align     .tl_set:N    =  \l_fig_align_tl,
  abovecap  .skip_set:N  =  \l_fig_abovecap_skip ,
  belowcap  .skip_set:N  =  \l_fig_belowcap_skip ,
  abovefig  .skip_set:N  =  \l_fig_abovefig_skip ,
  belowfig  .skip_set:N  =  \l_fig_belowfig_skip ,
  full      .bool_gset:N =  \g_fig_full_bool ,
  unknown   .code:n      =  \tl_set:Nx \l_fig_pos_tl { \l_keys_key_str },
}

\cs_set:Npn \__reset_fig: {
  \tl_set:Nx \l_fig_pos_tl { t }
  \tl_set:Nx \l_fig_cols_tl { 1 }
  \tl_set:Nn \l_fig_align_tl { \raggedleft }
  \skip_set:Nn \l_fig_abovecap_skip { 6pt }
  \skip_set:Nn \l_fig_belowcap_skip { 6pt }
  \skip_set:Nn \l_fig_abovefig_skip { 6pt }
  \skip_set:Nn \l_fig_belowfig_skip { 6pt }
}

\RenewDocumentEnvironment { figure } { O{} } {
  \__reset_fig:
  \bool_gset_false:N \g_fig_full_bool
  \dim_set:Nn \l_fig_width_dim { \linewidth }
  \keys_set:nn { ceur / fig } { #1 }
  \csxdef{fps@figure}{\l_fig_pos_tl}
  \csgdef{figwidth}{\dim_use:N \l_fig_width_dim}
  \cs_set_eq:NN \@makecaption \__make_fig_caption:nn
  \@float{figure}
  \l_fig_align_tl
  \sffamily\small
}{ \end@float }

\RenewDocumentEnvironment { figure* } { O{width=\textwidth} } {
  \__reset_fig:
  \bool_gset_true:N \g_fig_full_bool
  \dim_set:Nn \l_fig_width_dim { \FullWidth }
  \keys_set:nn { ceur / fig } { #1 }
  \csxdef{fps@figure}{\l_fig_pos_tl}
  \csgdef{figwidth}{\dim_use:N \l_fig_width_dim}
  \cs_set_eq:NN \@makecaption \__make_fig_caption:nn
  \@dblfloat{figure}
  \l_fig_align_tl
  \sffamily\small
  % \leftskip=-\FullWidth
}
{ \end@dblfloat }

%
% wrapped figure
%
\RequirePackage{wrapfig}

\dim_new:N \l_wrap_figwidth_dim
\dim_new:N \l_wrap_fighspace_dim
\dim_new:N \l_wrap_figvspace_dim
\dim_new:N \l_wrap_fighcorr_dim
\dim_new:N \l_wrap_figvcorr_dim
\dim_new:N \l_above_bio_dim
\int_new:N \l_wrap_figlcorr_int
\int_new:N \l_wrap_figlines_int
\tl_new:N  \l_wrap_figfile_tl

\NewDocumentCommand \wfigwidth { m }
  { \dim_set:Nn \l_wrap_figwidth_dim { #1 } }
\NewDocumentCommand \wfighspace { m }
  { \dim_set:Nn \l_wrap_fighspace_dim { #1 } }
\NewDocumentCommand \wfigvspace { m }
  { \dim_set:Nn \l_wrap_figvspace_dim { #1 } }
\NewDocumentCommand \wfighcorr { m }
  { \dim_set:Nn \l_wrap_fighcorr_dim { #1 } }
\NewDocumentCommand \wfigvcorr { m }
  { \dim_set:Nn \l_wrap_figvcorr_dim { #1 } }
\NewDocumentCommand \addfiglines { m }
  { \int_set:Nn \l_wrap_figlcorr_int { #1 } }
\NewDocumentCommand \abovebioskip { m }
  { \dim_set:Nn \l_above_bio_dim { #1 } }

\cs_new:Nn \__fig_defaults: {
  \wfigwidth  { 25.5mm }
  \wfighspace { 0mm }
  \wfigvspace { 0mm }
  \wfighcorr  { 0pt }
  \wfigvcorr  { -12pt }
  \wfigvcorr  { 0pt }
  \abovebioskip { 12pt }
  \tl_set:Nn  \l_wrap_figpos_tl { l }
  \int_set:Nn \l_wrap_figlines_int { 3 }
  \int_set:Nn \l_wrap_figlcorr_int { 1 }
  \tl_clear:N \l_wrap_figcap_tl
}

\__fig_defaults:

\keys_define:nn { wrap / fig } {
  width    .dim_set:N    =  \l_wrap_figwidth_dim ,
  hspace   .dim_set:N    =  \l_wrap_fighspace_dim ,
  vspace   .dim_set:N    =  \l_wrap_figvspace_dim ,
  hcorr    .dim_set:N    =  \l_wrap_fighcorr_dim ,
  vcorr    .dim_set:N    =  \l_wrap_figvcorr_dim ,
  lcorr    .int_set:N    =  \l_wrap_figlcorr_int ,
  pos      .tl_set:N     =  \l_wrap_figpos_tl ,
  lines    .int_set:N    =  \l_wrap_figlines_int ,
  cap      .tl_set:N     =  \l_wrap_figcap_tl ,
}

\cs_new:Npn \__find_fig_height:n #1 {
  \box_clear:N  \g_tmpa_box
  \hbox_gset:Nn \g_tmpa_box
  { \includegraphics [ width = \l_wrap_figwidth_dim ] { #1 } }
  \dim_zero:N \l_tmpa_dim
  \dim_set:Nn \l_tmpa_dim { \box_ht:N \g_tmpa_box }
  \dim_add:Nn \l_tmpa_dim { \box_dp:N \g_tmpa_box }
  \fp_set:Nn  \l_tmpa_fp  { \dim_to_fp:n { \l_tmpa_dim } }
  \fp_set:Nn  \l_tmpb_fp  { \dim_to_fp:n { \baselineskip } }
  % 
  \fp_set:Nn \l_wrap_figlines_fp
  { \fp_eval:n { ( \l_tmpa_fp / \l_tmpb_fp )  + .5 } }
  \int_set:Nn \l_wrap_figlines_int
  { \fp_to_int:N \l_wrap_figlines_fp }
  % 
  \iow_term:x { ...~wr-fig:~[BL:~\the\baselineskip] ~ ...}
  \iow_term:x { ...~wr-fig:~[LINE-FP:~ \fp_use:N \l_wrap_figlines_fp]~ ...}
  \iow_term:x { ...~wr-fig:~[LINE-INT:~ \int_use:N \l_wrap_figlines_int]~ ...}
}

\newbox \l_bio_text_box

\NewDocumentCommand \WrapFigure { o m } {
  \__fig_defaults:
  \IfNoValueTF { #1 } { } { \keys_set:nn { wrap / fig } { #1 } }
  \stepcounter { ca_biography_ctr }
  \__find_fig_height:n { #2 }
  \dim_zero:N \l_tmpb_dim
  \dim_set:Nn \l_tmpb_dim
  { \l_wrap_figwidth_dim + \l_wrap_fighspace_dim }
  \int_gadd:Nn \l_wrap_figlines_int { \int_use:N \l_wrap_figlcorr_int }
  \setlength { \columnsep } { 5pt }
  \setlength { \intextsep } { 0pt }
  % \mbox{}
  \ifbool { dc } {
    \xdef\Columnwidth{238.25pt}
  }{
    \xdef\Columnwidth{\the\textwidth}
  }
  \ifcsundef { cabio\theca_biography_ctr lines }
  {
    \setbox \l_bio_text_box = \vbox \bgroup
    \hsize = \dimexpr ( \Columnwidth - 72.28pt )
  }
  {
    \ifbool { dc } {
      \int_gset:Nn \l_wrap_figlines_int
      { \csuse { cabio\theca_biography_ctr lines } }
    } { }
    \skip_vertical:N \l_above_bio_dim
    \begin{wrapfigure}[\int_use:N \l_wrap_figlines_int]
      { \l_wrap_figpos_tl }
      [ \dim_use:N \l_wrap_fighcorr_dim ]
      { \dim_use:N \l_tmpb_dim }
      % \skip_vertical:N \l_wrap_figvcorr_dim
      \includegraphics[width=\l_wrap_figwidth_dim]{#2}
    \end{wrapfigure}
    \setbox \l_bio_text_box = \vbox \bgroup
    \hsize = \dimexpr ( \Columnwidth )
  }
}

\cs_set:Nn \__fwidth: { 1in }
\cs_set:Nn \__fpos: { l }

%
% short authors/title
%

\tl_new:N \__short_authors:
\newcommand\shortauthors[1]{ \cs_gset:Nn \__short_authors: { #1 } }

\tl_new:N \__short_title:
\newcommand\shorttitle[1]{ \cs_gset:Nn \__short_title: { #1 } }

\newcounter { ca_biography_ctr }
\newbool { cas_no_pic_bio }
\boolfalse { cas_no_pic_bio }

\NewDocumentCommand \bio { O{} m }
{
  \global \boolfalse { cas_no_pic_bio }
  \casbiographyfont
  \par \medskip  \tl_set:Nn \l_tmpa_tl { #2 }
  \tl_if_empty:NTF \l_tmpa_tl
  { \global \booltrue { cas_no_pic_bio } }
  { \WrapFigure [ #1 ]{ #2 } }
  \noindent \ignorespaces
}

\int_new:N \l_ca_temp_inta

\NewDocumentCommand \endbio { } {
 \ifbool{ cas_no_pic_bio } { } {
  \egroup
%  \fp_set:Nn \l_wrap_figlines_fp
%    { \fp_eval:n { ( ( \l_tmpa_fp +
%      \numexpr\dimexpr\the\ht\l_bio_text_box )
%      / \l_tmpb_fp )  + .5 } }
  \int_gset:Nn \l_ca_temp_inta
      { \numexpr\dimexpr(\the\ht\l_bio_text_box + 2\baselineskip )/
        \dimexpr\the\baselineskip }
  \iow_now:Nx \@auxout {
     \string\csgdef{cabio\theca_biography_ctr lines}
        { \int_use:N \l_ca_temp_inta } }
\mbox{}\vspace*{-4.5pt}\noindent
\unvbox \l_bio_text_box }
}

\let\casbiographyfont\relax

\NewDocumentEnvironment { biography } { o m }
{
  \IfValueTF { #1 }
  { \par\medskip \noindent \includegraphics[width=1in]{#1} }
  { }
  \par\smallskip
  \noindent \textbf{#2:}\enspace
}
{ }

\ExplSyntaxOff

%
% Customized Enumeration
%
\def\blstr#1{\gdef\@bslstr{#1}}
\def\@blstr{1}
\newdimen\leftMargin
\leftMargin=2em
\newtoks\@enLab  %\newtoks\@enfont
\def\@enQmark{?}
\def\@enLabel#1#2{%
  \edef\@enThe{\noexpand#1{\@enumctr}}%
  \@enLab\expandafter{\the\@enLab\csname the\@enumctr\endcsname}%
  \@enloop}
\def\@enSpace{\afterassignment\@enSp@ce\let\@tempa= }
\def\@enSp@ce{\@enLab\expandafter{\the\@enLab\space}\@enloop}
\def\@enGroup#1{\@enLab\expandafter{\the\@enLab{#1}}\@enloop}
\def\@enOther#1{\@enLab\expandafter{\the\@enLab#1}\@enloop}
\def\@enloop{\futurelet\@entemp\@enloop@}
\def\@enloop@{%
  \ifx A\@entemp         \def\@tempa{\@enLabel\Alph  }\else
  \ifx a\@entemp         \def\@tempa{\@enLabel\alph  }\else
  \ifx i\@entemp         \def\@tempa{\@enLabel\roman }\else
  \ifx I\@entemp         \def\@tempa{\@enLabel\Roman }\else
  \ifx 1\@entemp         \def\@tempa{\@enLabel\arabic}\else
  \ifx \@sptoken\@entemp \let\@tempa\@enSpace         \else
  \ifx \bgroup\@entemp   \let\@tempa\@enGroup         \else
  \ifx \@enum@\@entemp   \let\@tempa\@gobble          \else
                         \let\@tempa\@enOther
             \fi\fi\fi\fi\fi\fi\fi\fi
  \@tempa}
\newlength{\@sep} \newlength{\@@sep}
\setlength{\@sep}{.5\baselineskip plus.2\baselineskip
            minus.2\baselineskip}
\setlength{\@@sep}{.1\baselineskip plus.01\baselineskip
            minus.05\baselineskip}
\providecommand{\sfbc}{\rmfamily\upshape}
\providecommand{\sfn}{\rmfamily\upshape}
\def\@enfont{\ifnum \@enumdepth >1\let\@nxt\sfn \else\let\@nxt\sfbc \fi\@nxt}
\def\enumerate{%
   \ifnum \@enumdepth >3 \@toodeep\else
      \advance\@enumdepth \@ne
      \edef\@enumctr{enum\romannumeral\the\@enumdepth}\fi
   \@ifnextchar[{\@@enum@}{\@enum@}}
\def\@@enum@[#1]{%
  \@enLab{}\let\@enThe\@enQmark
  \@enloop#1\@enum@
  \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
   ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
  \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
  \expandafter\let\csname the\@enumctr\endcsname\@enThe
  \csname c@\@enumctr\endcsname7
  \expandafter\settowidth
            \csname leftmargin\romannumeral\@enumdepth\endcsname
            {\the\@enLab\hskip\labelsep}%
  \@enum@}
\def\@enum@{\list{{\@enfont\csname label\@enumctr\endcsname}}%
           {\usecounter{\@enumctr}\def\makelabel##1{\hss\llap{##1}}%
     \ifnum \@enumdepth>1\setlength{\topsep}{\@@sep}\else
           \setlength{\topsep}{\@sep}\fi
     \ifnum \@enumdepth>1\setlength{\itemsep}{0pt plus1pt minus1pt}%
      \else \setlength{\itemsep}{\@@sep}\fi
     %\setlength\leftmargin{\leftMargin}%%%{1.8em}
     \setlength{\parsep}{0pt plus1pt minus1pt}%
     \setlength{\parskip}{0pt plus1pt minus1pt}
                   }}

\def\endenumerate{\par\ifnum \@enumdepth >1\addvspace{\@@sep}\else
           \addvspace{\@sep}\fi \endlist}

\def\sitem{\@noitemargtrue\@item[\@itemlabel *]}

\def\itemize{\@ifnextchar[{\@Itemize}{\@Itemize[]}}

\def\@Itemize[#1]{%
  \def\next{#1}%
  \ifnum \@itemdepth >\thr@@\@toodeep\else
    \advance\@itemdepth\@ne
    \ifx\next\@empty\else\expandafter\def\csname
      labelitem\romannumeral\the\@itemdepth\endcsname{#1}\fi%
    \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
    \expandafter\list\csname\@itemitem\endcsname
    {\def\makelabel##1{\hss\llap{##1}}}%
  \fi
  \setlength{\itemsep}{\@@sep}
  \setlength{\parsep}{0pt plus1pt minus1pt}%
  \setlength{\parskip}{0pt plus1pt minus1pt}
}

%
% Customized theorem
% (non-italic enunciations)
%

\def\newdefinition#1{%
  \@ifnextchar[{\@odfn{#1}}{\@ndfn{#1}}}%]
\def\@ndfn#1#2{%
  \@ifnextchar[{\@xndfn{#1}{#2}}{\@yndfn{#1}{#2}}}
\def\@xndfn#1#2[#3]{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}\@newctr{#1}[#3]%
     \expandafter\xdef\csname the#1\endcsname{%
       \expandafter\noexpand\csname the#3\endcsname \@dfncountersep
          \@dfncounter{#1}}%
     \global\@namedef{#1}{\@dfn{#1}{#2}}%
     \global\@namedef{end#1}{\@enddefinition}}}
\def\@yndfn#1#2{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}%
     \expandafter\xdef\csname the#1\endcsname{\@dfncounter{#1}}%
     \global\@namedef{#1}{\@dfn{#1}{#2}}%
     \global\@namedef{end#1}{\@enddefinition}}}
\def\@odfn#1[#2]#3{%
  \@ifundefined{c@#2}{\@nocounterr{#2}}%
    {\expandafter\@ifdefinable\csname #1\endcsname
    {\global\@namedef{the#1}{\@nameuse{the#2}}
  \global\@namedef{#1}{\@dfn{#2}{#3}}%
  \global\@namedef{end#1}{\@enddefinition}}}}
\def\@dfn#1#2{%
  \refstepcounter{#1}%
  \@ifnextchar[{\@ydfn{#1}{#2}}{\@xdfn{#1}{#2}}}
\def\@xdfn#1#2{%
  \@begindefinition{#2}{\csname the#1\endcsname}\ignorespaces}
\def\@ydfn#1#2[#3]{%
  \@opargbegindefinition{#2}{\csname the#1\endcsname}{#3}\ignorespaces}
\def\@dfncounter#1{\noexpand\arabic{#1}}
\def\@dfncountersep{.}
\def\@begindefinition#1#2{\trivlist
   \item[\hskip\labelsep{\bfseries #1\ #2.}]\upshape}
\def\@opargbegindefinition#1#2#3{\trivlist
      \item[\hskip\labelsep{\bfseries #1\ #2\ (#3).}]\upshape}
\def\@enddefinition{\endtrivlist}

\def\@begintheorem#1#2{\trivlist
  \let\baselinestretch\@blstr
   \item[\hskip \labelsep{\bfseries #1\ #2.}]\itshape}
\def\@opargbegintheorem#1#2#3{\trivlist
  \let\baselinestretch\@blstr
      \item[\hskip \labelsep{\bfseries #1\ #2\ (#3).}]\itshape}
%
% Unnumbered roman proofs
%
\def\newproof#1{%
  \@ifnextchar[{\@oprf{#1}}{\@nprf{#1}}}
\def\@nprf#1#2{%
  \@ifnextchar[{\@xnprf{#1}{#2}}{\@ynprf{#1}{#2}}}
\def\@xnprf#1#2[#3]{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}\@newctr{#1}[#3]%
     \expandafter\xdef\csname the#1\endcsname{%
       \expandafter\noexpand\csname the#3\endcsname \@prfcountersep
          \@prfcounter{#1}}%
     \global\@namedef{#1}{\@prf{#1}{#2}}%
     \global\@namedef{end#1}{\@endproof}}}
\def\@ynprf#1#2{%
  \expandafter\@ifdefinable\csname #1\endcsname
    {\@definecounter{#1}%
     \expandafter\xdef\csname the#1\endcsname{\@prfcounter{#1}}%
     \global\@namedef{#1}{\@prf{#1}{#2}}%
     \global\@namedef{end#1}{\@endproof}}}
\def\@oprf#1[#2]#3{%
  \@ifundefined{c@#2}{\@nocounterr{#2}}%
    {\expandafter\@ifdefinable\csname #1\endcsname
    {\global\@namedef{the#1}{\@nameuse{the#2}}%
  \global\@namedef{#1}{\@prf{#2}{#3}}%
  \global\@namedef{end#1}{\@endproof}}}}
\def\@prf#1#2{%
  \refstepcounter{#1}%
  \@ifnextchar[{\@yprf{#1}{#2}}{\@xprf{#1}{#2}}}
\def\@xprf#1#2{%
  \@beginproof{#2}{\csname the#1\endcsname}\ignorespaces}
\def\@yprf#1#2[#3]{%
  \@opargbeginproof{#2}{\csname the#1\endcsname}{#3}\ignorespaces}
\def\@prfcounter#1{\noexpand\arabic{#1}}
\def\@prfcountersep{.}
\def\@beginproof#1#2{\trivlist\let\baselinestretch\@blstr
   \item[\hskip \labelsep{\scshape #1.}]\rmfamily}
\def\@opargbeginproof#1#2#3{\trivlist\let\baselinestretch\@blstr
      \item[\hskip \labelsep{\scshape #1\ (#3).}]\rmfamily}
\def\@endproof{\endtrivlist}
\newcommand*{\qed}{\hbox{}\hfill$\Box$}

\xspaceaddexceptions{]}

\ExplSyntaxOn

%%
%% Bibliography
%%

% \RequirePackage[numbers,sort&compress]{natbib}
\RequirePackage[numbers]{natbib}
\AtBeginDocument{\bibsep=0pt}

\bibliographystyle{elsarticle-num-names}
% \bibliographystyle{elsarticle-num}

%%
%% Fonts
%%

\ifpdftex
\RequirePackage[T1]{fontenc}
\fi

%% Main font
\file_if_exist:nTF { libertinus.sty }
{
  \RequirePackage{libertinus}
}{
  \iow_term:x { Libertinus fonts are not available }
}

%% Math font for pdfLaTeX
% \ifpdftex
% \file_if_exist:nTF { libertinust1math.sty }
% {
%   \RequirePackage{libertinust1math}
% }{
%   \iow_term:x { Libertinus math fonts are not available }
% }
% \fi

\ExplSyntaxOff

%%
%% Compatibility workaround
%%

%% Old font naming commands for Koma class

\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}

\endinput

%
% End of class 'ceurart'
%

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% coding: utf-8-unix
%%% End:
